3

我目前正在编写一个测试,以检查该类型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 fs1.001 ns1001 psC3

需要注意的是,Vivado 的合成器报告了奇怪的结果:

Parameter C1 bound to: 32'b00111011101010100000110001000000    -- 1001000000
Parameter C2 bound to: 32'b10010011011101001011110001101010    -- 2473901162
Parameter C3 bound to: 32'sb00000000000000000000000000000001   -- 1
4

1 回答 1

2

这是浮点数的问题,与 VHDL 无关。整数十进制数可以转换为二进制并返回十进制而不会丢失信息(除非数字太大或太小)。这不是小数部分的情况。十进制数 1.001 转换为二进制是无理数。从二进制转换回十进制时,会出现舍入错误。

Quartus 和 ISE 显示出预期的行为。

在 Vivado 案例中,. 的 MSB 发生了一些事情C2。似乎在有符号整数和无符号整数之间发生了一些不应该发生的转换。并且C3显然是四舍五入的。

您的示例可用于支持使用主要单位是最佳选择的规则。

于 2016-01-11T18:24:24.070 回答