11

以下は私が実行しているコードです。wait until私の質問は、modelsimで 3 番目のトリガーが実行されないのはなぜですか? コンソール出力は単純GOT HEREです。ラインに到達することはありませんGOT HERE 2wait until <SIGNAL> = 1条件が2回とも真であるため、同じものが2回連続しても問題ないと思います。そこに「イベント」を追加しなかったので、シミュレーターがエッジを確認する必要はないと思います。誰でもこの動作を説明できますか?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity example_wait_failure is
end example_wait_failure;

architecture behave of example_wait_failure is

  signal r_CLK_TB : std_logic := '0';

begin

  r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;


  p_TEST : process
  begin

    wait until r_CLK_TB = '1';
    report "GOT HERE" severity note;

    wait until r_CLK_TB = '1';
    wait until r_CLK_TB = '1';
    report "GOT HERE 2 " severity note;

  end process p_TEST;

end behave;
4

3 に答える 3

18

その振る舞いは、wait ステートメントの詳細 (Jim Lewis が参照している wait の詳細) にあります。その理由は、waitステートメントに次の 3 つの部分があるためです。

wait
  [on sensitivity_list]
  [until condition]
  [for time_expression];  -- Only for timeout, and not relevant here

wait関連するコードの には一部しかないuntilため、sensitivity_list は VHDL 標準に従って作成されます。この場合、生成された Sensitivity_list には が含まれますr_CLK_TB

VHDL 標準には、コードと正確に一致する例があり、次のように述べられています。

wait until r_CLK_TB = '1';

以下と同じです:

loop
  wait on r_CLK_TB;
  exit when r_CLK_TB = '1';
end loop;

そのため、 (コメントに書かれているように) にwaita が明示的に含まれていなくても、実行は最初のを に渡すためにイベント on まで待機することになります。それは直感的ですか...自分で判断してください;-)wait until r_CLK_TB'eventr_CLK_TBwaitwait on r_CLK_TB

したがって、元のコードを次のように変更する必要があります。

wait until r_CLK_TB = '1';

は次のように置き換えられます。

if r_CLK_TB /= '1' then
  wait until r_CLK_TB = '1';
end if;

この場合、「GOT HERE」と「GOT HERE 2」の両方が 20 ns で表示されます。これは、ここでは 3 つの構成すべての条件が TRUE になるためです。

于 2013-12-10T06:57:40.397 に答える
3

宿題?テスト?

待機がどのように機能するかについて詳細を調べる必要があります。待機は、少なくともデルタ サイクルの間、常に一時停止します。条件内のシグナルが変化し、式が真の場合にのみ、待機が再開されます。では、2 番目のレポート ステートメントに到達するには、ここで「1」への移行が何回必要ですか?

「1」への遷移はいくつありますか?

signal r_CLK_TB : std_logic := '0';
...
r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns; 

待機がどのように機能するかについて詳細を調べる必要があります。待機は、少なくともデルタ サイクルの間、常に一時停止します。条件内のシグナルが変化し、式が真の場合にのみ再開するまで待機します。では、ここで「1」への遷移はいくつ必要ですか?

r_CLK_TB を次のように変更するとどうなりますか?

r_CLK_TB <= not r_CLK_TB after 20 ns ; 
于 2013-12-09T23:13:34.410 に答える