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;
ダミー フリップフロップは、一部のツールが空のデザインについてエラーを出すのを防ぐために使用されます。
XST14.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)
。
Vivado 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]
シンセは無限大に丸めるモードを使用しているようで、範囲チェックなしで型変換を処理します。だから多分natural(..)
への単なるエイリアスinteger(..)
です。
コメント行:constant int_2 : INTEGER := natural(-0.5);
エラーをスローしません。
GHDL 0.29:
GHDL 0.29 は範囲チェックインを行いませんnatural(..)
。時代遅れであることはわかっていますが、0.31 は私を嫌っているので、これが既に修正されているかどうかはわかりません。
GHDL 0.31:
後で結果を紹介します。Top_PhysicalTest_Simple.vhdl
:29:14: ファイル std_logic_1164.v93 が変更されたため、再解析する必要がある
私の質問:
- VHDL は丸めモードを定義しますか? もしそうなら、どれですか?
- モードが定義されていない場合、丸めをどのように処理すればよいですか?