使用下面的測試代碼:爲什麼`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 「。
IEEE標準2076個至08年9.3.4函數調用,第5(部分):*函數調用的評價包括評價在調用中指定的實際參數表達式以及與函數形式參數關聯的默認表達式的評估,這些表達式沒有與它們相關的實際參數。在這兩種情況下,結果值都應屬於關聯形式參數的子類型。 ... *表示一個強制性要求(1.3.1第4段),儘管Modelsim爲了性能目的而選擇它。 – user1155120
@BrianDrummond:在我的'numeric_std'包中沒有額外的'> =',如果我在模塊或包中創建了自己的類似函數,那麼會立即報告負值。因此,它看起來像ModelSim針對'numeric_std'所做的性能優化,正如@ user1155120所示。我不會試圖將它交給Mentor,因爲幾乎不可能爲ModelSim啓動一個支持案例;至少我沒有得到必要的關注。 – EquipDev