使用下面的测试代码:为什么`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