2017-01-16 1 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. 

Ни один из которых позволяет подписанное количество (Signed или целое число) в качестве второго аргумента.

Таким образом, вы можете посмотреть источник для numeric_std в своей установке, чтобы узнать, является ли это другой версией, с оператором >=, допускающим смешанные типы неподписанных и целочисленных типов. Я сомневаюсь, что он существует: он был бы опасен для такого рода недоразумений.

Если такого оператора нет, Modelim здесь разрешительный; есть ли варианты компиляции для более строгого соблюдения?

И если вы думаете, что это излишне педантичным, считают это:

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

IEEE Std 1076-2008 9.3.4 вызовы функций, пункт 5 (в части): * Оценка вызова функции включает в себя оценку из фактические выражения параметров, указанные в вызове и оценки выражений по умолчанию, связанных с формальными параметрами функции, которые не имеют связанных с ними фактических параметров. В обоих случаях результирующее значение должно принадлежать подтипу связанного формального параметра. ... * Указывает обязательное требование (1.3.1 п. 4), несмотря на то, что Modelsim делает его необязательным для достижения целей. – user1155120

+0

@BrianDrummond: в моем 'numeric_std' пакете не добавлено'> = ', и если я сделаю свою собственную аналогичную функцию в модуле или в пакете, то отрицательное значение будет сообщено немедленно. Таким образом, это выглядит как оптимизация производительности, сделанная ModelSim только для 'numeric_std', как предлагает @ user1155120.Я не буду пытаться получить это на Mentor, так как практически невозможно запустить приложение поддержки для ModelSim; по крайней мере, у меня нет необходимого внимания. – EquipDev

Смежные вопросы