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 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