При отладке обработки определяемых пользователем физических типов в Vivado (подробнее ), я обнаружил другое поведение для преобразования типа из вещественного в целочисленное.
Вот мой пример кода:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.MATH_REAL.all;
entity Top_PhysicalTest_Simple is
port (
Clock : in STD_LOGIC;
Input : in STD_LOGIC;
Output : out STD_LOGIC
);
end;
architecture top of Top_PhysicalTest_Simple is
constant int_1 : INTEGER := natural(0.5);
constant int_2 : INTEGER := integer(-0.5);
-- constant int_2 : INTEGER := natural(-0.5);
begin
assert FALSE report "16 - int_1 (natural(0.5)): " & INTEGER'image(int_1) severity note;
assert FALSE report "17 - int_2 (natural(-0.5)): " & INTEGER'image(int_2) severity note;
Output <= Input when rising_edge(Clock);
end;
Фальшивый триггер используется, чтобы некоторые инструменты не жаловались на пустой дизайн.
XST 14.7:
Elaborating entity <Top_PhysicalTest_Simple> (architecture <top>) from library <work>.
Note: "16 - int_1 (natural(0.5)): 1"
Note: "17 - int_2 (natural(-0.5)): 0"
XST, кажется, использует режим round up и обрабатывает преобразование типа, включая проверку диапазона. Поэтому я должен использовать integer(-0.5)
вместо natural(-0.5)
.
Вивадо 2014.4:
[Synth 8-63] RTL assertion: "16 - int_1 (natural(0.5)): 1" ["D:/Temp/PhysicalTest_Vivado2014.4/vhdl/Top_PhysicalTest_Simple.vhdl":80]
[Synth 8-63] RTL assertion: "17 - int_2 (natural(-0.5)): -1" ["D:/Temp/PhysicalTest_Vivado2014.4/vhdl/Top_PhysicalTest_Simple.vhdl":81]
Похоже, что Synth использует режим округление до бесконечности и обрабатывает преобразование типов без проверки диапазона. Так что, возможно, natural(..)
— это просто псевдоним integer(..)
.
Строка с комментариями: constant int_2 : INTEGER := natural(-0.5);
не выдает ошибок.
GHDL 0.29:
GHDL 0.29 не выполняет проверку диапазона в natural(..)
. Я знаю, что это устарело, но поскольку 0.31 меня ненавидит, я не могу сказать, исправлено ли это уже.
GHDL 0.31:
Я представлю результаты позже. GHDL отказывается анализировать мой код, потому что:
Top_PhysicalTest_Simple.vhdl:29:14: файл std_logic_1164.v93 изменился и должен быть проанализирован повторно
Мои вопросы:
- Определяет ли VHDL режим округления? И если да, то какой?
- Как мне обрабатывать округление, если режим не определен?
ghdl -e ...
:) Я пытался установить ghdl 0.31 на свою виртуальную машину Linux, но версия пакета не соответствует. Debian 8.0 (тестирование) libgnat-4.9, ghdl требует 4.6, но это вопрос для другого дня... - person Paebbels   schedule 07.01.2015ghdl -r Top_PhysicalTest_Simple - top_phystest_simple.vhdl:18:3:@0ms:(assertion note): 16 - int_1 (natural(0.5)): 1 top_phystest_simple.vhdl:19:3:@0ms:(assertion note): 17 - int_2 (natural(-0.5)): -1
. Нужен флаг, re: Ответ Филиппа? Для натурального (-0,5) Если метка типа обозначает подтип, преобразование состоит из преобразования в целевой тип с последующей проверкой того, что результат преобразования принадлежит подтипу, ..., и целевой подтип преобразования типа тип или подтип, обозначенный знаком типа, сообщает об обновлениях ghdl. - person   schedule 08.01.2015