サーチ…


構文

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

LISTCONDITION表示されるすべての信号のリストです。また、次のものと同等です。

    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;


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow