2017-01-16 128 views
2

使用下面的測試代碼:爲什麼`to_unsigned(0,4)> = -1`在運行時評估爲`FALSE`?

library ieee; 
use ieee.numeric_std.all; 
architecture sim of tb is 
begin 
    process is 
    begin 
    for c in -1 to 1 loop 
     assert to_unsigned(0, 4) >= c report "Fails: 0 >= " & integer'image(c) severity NOTE; 
    end loop; 
    wait; 
    end process; 
end architecture; 

顯示了使用的ModelSim 10.5A輸出:

Loading work.tb(sim) 
** Note: Fails: 0 >= -1 
    Time: 0 ns Iteration: 0 Instance: /tb 
** Note: Fails: 0 >= 1 
    Time: 0 ns Iteration: 0 Instance: /tb 

所以有效to_unsigned(0, 4) >= -1評估,以FALSE,而這並不是在運行時報道當我用for循環。爲什麼是這樣?

注意,如果我寫to_unsigned(0, 4) >= -1不使用for循環用於獲取在運行時-1值,則ModelSim的編譯器將報告-1(類型std.STANDARD.NATURAL),該「值超出範圍0到2147483647 「。

回答

2

TL/DR:無論您在哪裏獲得對Modelsim的技術支持,都可以問這個問題,然後用他們的回答更新問題。

快速重寫和交叉校驗與(一般相當嚴格和準確)ghdl模擬器:

library ieee; 
use ieee.numeric_std.all; 

entity tb is 
end tb; 

architecture sim of tb is 
begin 
    process is 
    begin 
    for c in -1 to 1 loop 
     assert to_unsigned(0, 4) 
     >= 
     c 
     report "Fails: 0 >= " & integer'image(c) severity NOTE; 
    end loop; 
    wait; 
    end process; 
end architecture; 

ghdl -r tb
./tb:error: bound check failure at tb.vhd:14
./tb:error: simulation failed

示出了結合的檢查錯誤恰恰在c評價這是不內的合法範圍爲無符號或自然。

所以問題是,無論是ghdl還是Modelsim挑選不合適的>=運算符?

numeric_std的來源僅顯示兩個>=運算符定義,其中第一個參數是unsigned。 (該文件是「版權2008」,從而爲VHDL-2008標準。)

-- Id: C.19 
    function ">=" (L, R : UNRESOLVED_UNSIGNED) return BOOLEAN; 
    -- Result subtype: BOOLEAN 
    -- Result: Computes "L >= R" where L and R are UNRESOLVED_UNSIGNED vectors possibly 
    --   of different lengths. 

    -- Id: C.23 
    function ">=" (L : UNRESOLVED_UNSIGNED; R : NATURAL) return BOOLEAN; 
    -- Result subtype: BOOLEAN 
    -- Result: Computes "L >= R" where L is an UNRESOLVED_UNSIGNED vector and 
    --   R is a nonnegative INTEGER. 

均未允許符號量(簽名或整數)作爲第二個參數。

因此,您可能需要查看安裝中的numeric_std的源代碼,以查看它是否爲不同的修訂版本,其中>=運算符允許混合的Unsigned和Integer數據類型。我懷疑它是否存在:它會很危險地容易出現這種誤解。

如果沒有這樣的操作員,Modelsim在這裏是寬容的;是否有編譯選項來啓用更嚴格的合規性?

如果你認爲這是不必要的迂腐,考慮一下:

c := -1; 
if to_unsigned(0, 4) >= c then 
    emergency_stop; 
end if; 
+0

IEEE標準2076個至08年9.3.4函數調用,第5(部分):*函數調用的評價包括評價在調用中指定的實際參數表達式以及與函數形式參數關聯的默認表達式的評估,這些表達式沒有與它們相關的實際參數。在這兩種情況下,結果值都應屬於關聯形式參數的子類型。 ... *表示一個強制性要求(1.3.1第4段),儘管Modelsim爲了性能目的而選擇它。 – user1155120

+0

@BrianDrummond:在我的'numeric_std'包中沒有額外的'> =',如果我在模塊或包中創建了自己的類似函數,那麼會立即報告負值。因此,它看起來像ModelSim針對'numeric_std'所做的性能優化,正如@ user1155120所示。我不會試圖將它交給Mentor,因爲幾乎不可能爲ModelSim啓動一個支持案例;至少我沒有得到必要的關注。 – EquipDev

相關問題