3

time現在、さまざまな FPGA ベンダー ツールで型が適切に合成/シミュレーションされているかどうかを確認するテストを作成しています。コーナー ケースの 1 つは、時間値の抽象リテラルとして実際のリテラルを使用することです1.001 us

IEEE 規格。1076-2008、セクション 5.2.4.1 または IEEE Std. 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 を実行する必要はほとんどありません。整数の 10 進数は、情報を失うことなく 2 進数に変換してから 10 進数に戻すことができます (数値が大きすぎたり小さすぎたりしない限り)。これは小数の場合には当てはまりません。2 進数に変換された 10 進数 1.001 は無理数です。2 進数から 10 進数に戻すと、丸め誤差が発生します。

Quartus と ISE は期待どおりの動作を示します。

Vivado の場合、MSB のC2. 符号付き整数と符号なし整数の間の変換が行われるべきではない場所で、何らかの変換が行われたようです。そして、C3明らかに丸められました。

あなたの例は、プライマリユニットを使用することが最良の選択であるというルールをサポートするために使用できます.

于 2016-01-11T18:24:24.070 に答える