2007年08月29日
VHDL TIPS 「postponed processの使用法」
前回のシミュレーション・サイクルで少し触れた実行遅延プロセスを紹介する。
実行遅延プロセスはVHDL93で追加された機能で、その時刻の全てのデルタサイクルが終わった後で実行されるプロセスである。
動作をサンプルソースで見てみる事にする。
以下のソースは4ビットの同期カウンタを通常のプロセスと実行遅延プロセスでセットアップチェックを行い動作を比較した例だ。
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity PP_TEST is
end PP_TEST;
architecture behavior of PP_TEST is
signal CLK : std_logic;
signal COUNT : std_logic_vector(3 downto 0) := (others => '0');
begin
-- クロック生成
process begin
CLK <= '0';
wait for 10 ns;
CLK <= '1';
wait for 10 ns;
end process;
-- CLKでCOUNTをインクリメント
process ( CLK ) begin
if ( CLK'event and CLK = '1' ) then
COUNT <= COUNT + '1';
end if;
end process;
-- COUNTのセットアップチェック
process ( CLK ) begin
if ( CLK = '1' ) then
assert ( COUNT'last_event >= 5 ns )
report "Setup Time was not suitable."
severity WARNING;
end if;
end process;
-- COUNTのセットアップチェック
postponed process ( CLK ) begin
if ( CLK = '1' ) then
assert ( COUNT'last_event >= 5 ns )
report "Setup Time was not suitable.(postponed)"
severity WARNING;
end if;
end process;
end behavior;
これを実行すると実行遅延プロセスのアサーションだけアクティブになる。
これは、先ほども書いたが全てのデルタ遅延が処理された後でカウンタのセットアップチェックを行うためセットアップ時間が0となり5ns以上では無いのでアサートする。
一方、通常のプロセスはカウンタの値が更新される1つ前のデルタサイクルでセットアップチェックを行うためセットアップ時間が10nsとなり5ns以上なのでアサートされない。
ここで注意として実行遅延プロセスでクロックイベント等を評価した場合、デルタサイクルが無い場合を除き真が返ってくることはない。
また、実行遅延プロセスでデルタサイクルを発生させる事は禁止になっている。
簡単に言うと、実行遅延プロセスで「if ( CLK'event and CLK = '1' )」と書いても既にクロックイベントは終了しているのでこのIF文は実行される事は無い。と言う事と、実行遅延プロセスで「A <= B;」等と信号の代入を行ってはダメと言う事である。