サーチ…
構文
- wait [on SIGNAL1 [、SIGNAL2 [...]]] [CONDITIONまで] [TIMEOUT]。
- 待つ; - 永遠の待つ
- s1、s2を待ちます。 - 信号s1またはs2(またはその両方)が変化するまで待つ
- s1 = 15になるまで待つ。 - 信号s1が変化し、その新しい値が15になるのを待つ
- 10 nsの間、s1 = 15まで待つ; - 信号s1が変化し、その新しい値が最大10nsで15になるまで待つ
永遠の待つ
wait
ステートメントの最も簡単な形式は単純です:
wait;
プロセスがこれを実行するたびに、永久に中断されます。シミュレーションスケジューラは再びそれを再開しません。例:
signal end_of_simulation: boolean := false;
...
process
begin
clock <= '0';
wait for 500 ps;
clock <= '1';
wait for 500 ps;
if end_of_simulation then
wait;
end if;
end process;
感度リストと待機ステートメント
機密性リストを持つプロセスには、待機文も含めることはできません。これは、同じプロセスと同じで、機密性リストなしで、さらに最後の1つのステートメントがあります。
wait on <sensitivity_list>;
例:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
次のものと同等です。
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008は感度リストにall
キーワードを導入しました。これは、プロセスのどこかで読み込まれたすべての信号に相当します 。合成のためのコンビナトリアルプロセスを設計する際には、不完全な感度リストを避けるのが特に便利です。不完全な感度リストの例:
process(a, b)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
ci
信号は感度リストの一部ではなく、これは合成の前後でシミュレーションのミスマッチにつながるコーディングエラーである可能性が非常に高いです。正しいコードは次のとおりです。
process(a, b, ci)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
VHDL2008では、 all
キーワードはこれを単純化し、リスクを軽減します。
process(all)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
条件が満たされるまで待つ
on <sensitivity_list>
およびfor <timeout>
句を次のように省略することは可能です。
wait until CONDITION;
これは以下と同等です:
wait on LIST until CONDITION;
LIST
はCONDITION
表示されるすべての信号のリストです。また、次のものと同等です。
loop
wait on LIST;
exit when CONDITION;
end loop;
重要な結果は、 CONDITION
にシグナルが含まれていない場合、次のようになります。
wait until CONDITION;
次のものと同等です。
wait;
これの古典的な例は有名なものです:
wait until now = 1 sec;
これは考えられることをしません。 now
はシグナルではなく関数なので、このステートメントを実行するとプロセスが永久に中止されます。
特定の期間待つ
for <timeout>
句のみを使用すると、無条件待ちを特定の期間持続させることができます。これは合成可能ではありません(実際のハードウェアはこのような動作を簡単に実行できません)が、イベントのスケジューリングやテストベンチ内でのクロックの生成によく使用されます。
この例では、テスト対象ユニットを駆動するためのシミュレーションテストベンチに100 MHz、50%のデューティサイクルクロックを生成します。
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
この例では、テストベンチの刺激/分析プロセスの順序を決めるために、リテラル時間の待機をどのように使用するかを示しています。
process
begin
rst <= '1';
wait for 50 ns;
wait until rising_edge(clk); --deassert reset synchronously
rst <= '0';
uut_input <= test_constant;
wait for 100 us; --allow time for the uut to process the input
if uut_output /= expected_output_constant then
assert false report "failed test" severity error;
else
assert false report "passed first stage" severity note;
uut_process_stage_2 <= '1';
end if;
...
wait;
end process;