在调试 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 似乎使用向上取整模式,它处理类型转换包含范围检查。所以我必须使用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是否定义了舍入模式?如果是的话,是哪一个?
- 如果没有定义模式,我应该如何处理舍入?