Используя тестовый код ниже:Почему `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 Std 1076-2008 9.3.4 вызовы функций, пункт 5 (в части): * Оценка вызова функции включает в себя оценку из фактические выражения параметров, указанные в вызове и оценки выражений по умолчанию, связанных с формальными параметрами функции, которые не имеют связанных с ними фактических параметров. В обоих случаях результирующее значение должно принадлежать подтипу связанного формального параметра. ... * Указывает обязательное требование (1.3.1 п. 4), несмотря на то, что Modelsim делает его необязательным для достижения целей. – user1155120
@BrianDrummond: в моем 'numeric_std' пакете не добавлено'> = ', и если я сделаю свою собственную аналогичную функцию в модуле или в пакете, то отрицательное значение будет сообщено немедленно. Таким образом, это выглядит как оптимизация производительности, сделанная ModelSim только для 'numeric_std', как предлагает @ user1155120.Я не буду пытаться получить это на Mentor, так как практически невозможно запустить приложение поддержки для ModelSim; по крайней мере, у меня нет необходимого внимания. – EquipDev