2
signal a:bit:='1'; signal b:bit:='0'; signal c:bit:='0';
begin
  process
  variable d:bit:='0';
    begin
    if (a='1')or(b='0') then a <= inertial not d after 1ns;
  else a<=inertial not c after 1.5ns;
    end if;
    d := a and b;
  b <= inertial (b)nand(a or d) after 1ns;          
  wait on a,b,c;end process;
  c <= a and b after 1ns;
end Behavioral;

a と b の両方が同時に値を変更するとどうなるでしょうか。たとえば、2ns です。

プロセスは 2 回トリガーされますか?

その場合、a、b にどの値を使用する必要がありますか、a イベントのプロセスを通過する場合、b 信号はその時点で変更されますか、それともプロセスが b に対して再度実行されるときに変更されますか?

また、ステートメント c <= a および b は 1ns 後です。はプロセス外ですが、アフターはどのように機能しますか? after がなければ、ただの AND 単位であり、遅延はありません。

4

2 に答える 2

2
wait on a,b,c;

デルタサイクル中にシグナルの 1 つがトランザクションを持つのを待ちます。

それらの 2 つまたはすべてが「アクティブ化」された場合、シミュレーターに違いはなく、待機から抜け出すだけです。残りのシグナルの現在のデルタサイクルからのトランザクションを「保存」せず、それらを転送します。

于 2013-02-01T13:39:17.363 に答える
1

このプロセスが正しく合成されないことを理解していただければ幸いです。

1 回または 2 回トリガーするプロセスに関しては、a または b のイベントが同じデルタ サイクルで発生するかどうかによって異なります。プロセスに Report ステートメントを追加して調べます。

プロセスは遅延ステートメントを介して A と B を駆動するため、両方の割り当てが同じデルタ サイクルで動作すると予想されます。タイムステップの最初のデルタなので、一度トリガーされると思います。

ここで、新しいシグナル「e」を導入し、「b」ではなくプロセスからそれを駆動し、シグナルの割り当てb <= e;をプロセス外に追加した場合、「b」にデルタ サイクル遅延が導入され、プロセスが起動するはずです。二回。

ステートメントc <= a and b after 1ns;は本質的に a と b に依存する別個のプロセスであるため、同じように機能するはずです。

この回答は、デルタ サイクル モデルを理解するのに役立つ場合があります。

于 2013-01-30T16:30:39.607 に答える