Verilog スケジューリング セマンティクス
通常、Verilog デザインとテストベンチには、always
で構成される多数のコード行があります。 または initial
シミュレーション中の異なる時点でアクティブになるブロック、連続代入、およびその他の手続き型ステートメント。
Verilog モデルの信号値のすべての変化は、更新イベントと見なされます .そして always
などのプロセス と assign
これらの更新イベントに敏感なブロックは任意の順序で評価され、評価イベントと呼ばれます .これらのイベントはさまざまなタイミングで発生する可能性があるため、イベント キューにスケジュールすることで、より適切に管理され、正しい実行順序が保証されます。 シミュレーション時間順に並べられています。
module tb;
reg a, b, c;
wire d;
// 'always' is a process that gets evaluated when either 'a' or 'b' is updated.
// When 'a' or 'b' changes in value it is called an 'update event'. When 'always'
// block is triggered because of a change in 'a' or 'b' it is called an evaluation
// event
always @ (a or b) begin
c = a & b;
end
// Here 'assign' is a process which is evaluated when either 'a' or 'b' or 'c'
// gets updated
assign d = a | b ^ c;
endmodule
イベント キュー
シミュレーション ステップは、4 つの異なる領域に分割できます。アクティブなイベント キューは、現時点で実行する必要がある一連のプロセスにすぎません。その結果、アクティブなイベント キューまたは他のイベント キューにスケジュールされるプロセスが増える可能性があります。イベントはどの地域にも追加できますが、アクティブ からは常に削除されます
- アクティブ イベントは現在のシミュレーション時間に発生し、任意の順序で処理できます。
- 非アクティブ イベントは現在のシミュレーション時間に発生しますが、すべてのアクティブなイベントが処理された後に処理されます
- ノンブロッキング代入 以前に評価されたイベントは、アクティブなイベントと非アクティブなイベントがすべて処理された後に割り当てられます。
- 監視 イベントは、アクティブ、非アクティブ、ノンブロッキングのすべての割り当てが完了した後に処理されます。
現在のタイム ステップのアクティブ キュー内のすべてのイベント が実行されると、シミュレーターは時間を次の時間ステップに進め、アクティブなキューを実行します。
module tb;
reg x, y, z
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
シミュレーションは時間 0 で開始され、シミュレーション時間が 1 時間単位に達したときに最初のステートメントが実行されるようにスケジュールされ、x と y が 1 に割り当てられます。これは、1 時間単位である現在の時間のアクティブなキューです。その後、シミュレーターは、z が 0 に割り当てられる 1 つの時間単位の後に、次のステートメントをスケジュールします。
シミュレーションが非決定的である理由
シミュレーション中に競合状態が発生し、同じデザインとテストベンチに対して異なる出力が得られる場合があります。非決定的な動作の理由の 1 つは、アクティブ であるためです。 イベントはキューから削除して、任意の順序で処理できます。
Verilog