我目前正在编写一个测试,以检查该类型time
是否在各种 FPGA 供应商工具中正确合成/模拟。一种极端情况是使用真实文字作为时间值的抽象文字,例如:1.001 us
.
IEEE标准。1076-2008,第 5.2.4.1 节或 IEEE 标准。1076-1993,第 3.1.3 节,第 8 段规定:
每个物理类型的值对应一个位置编号。一个单元名称对应的值的位置编号是该单元名称所代表的主要单元的数量。带有抽象文字部分的物理文字对应的值的位置编号是不大于抽象文字的值与所附单元名称的位置编号的乘积的最大整数。
根据定义TIME
(见16.2或14.2节),主要单位是飞秒,因此,位置数1 us
是1,000,000,000。因此, 的位置编号1.001 us
应该是 1,001,000,000,这也是 的位置编号1001 ns
。因此,两个值应该相等。
但是,当我尝试合成或模拟以下精简单元时,我会得到不同的结果。我已经检查过,最小时间分辨率是 1 fs 或 1 ps。
entity physical_test is
generic (
C1 : time := 1001 ns;
C2 : time := 1.001 us;
C3 : time := TIME'val(integer(real(TIME'pos(1 us)) * 1.001))
);
port (
y : out bit);
end entity physical_test;
architecture rtl of physical_test is
function f return boolean is
begin
report "C1 = " & TIME'image(C1) severity note;
report "C2 = " & TIME'image(C2) severity note;
report "C3 = " & TIME'image(C3) severity note;
return false;
end f;
constant C : boolean := f;
begin -- architecture rtl
y <= '0';
end architecture rtl;
QuestaSim (ModelSim) 是唯一报告预期结果的工具:
# ** Note: C1 = 1001000000 fs
# ** Note: C2 = 1001000000 fs
# ** Note: C3 = 1001000000 fs
但是,使用 Quartus 15.0 或 ISE 14.7 进行综合时的实际结果是:
Note: "C1 = 1001000000 fs"
Note: "C2 = 1000999999 fs"
Note: "C3 = 1001000000 fs"
因此, 的值C2
并不像预期的那样。如果我将引用的文本写成一个等式,那么我会在常量中得到预期的结果C3
。当我使用 ISE 14.7 或 Vivado 2015.4 的集成模拟器时,我得到了类似的结果:
Note: "C1 = 1001000 ps"
Note: "C2 = 1000999 ps"
Note: "C3 = 1001000 ps"
那么,Quartus / ISE / Vivado 的行为是否应该被视为错误?还是VHDL标准允许1.001 us
不等于1001 ns
?
编辑:当我比较以及比较时1.001 ps
,也会发生错误。由于人工计算也是正确的,因此真实的准确性应该不成问题。1001 fs
1.001 ns
1001 ps
C3
需要注意的是,Vivado 的合成器报告了奇怪的结果:
Parameter C1 bound to: 32'b00111011101010100000110001000000 -- 1001000000
Parameter C2 bound to: 32'b10010011011101001011110001101010 -- 2473901162
Parameter C3 bound to: 32'sb00000000000000000000000000000001 -- 1