Verilog の $display と$strobeと$ monitorの違いは何ですか? イベント キューでそれぞれが適用されるのはいつで、ステートメントはどのように相互作用しますか? ステートメントは別のステートメントを禁止できますか?
2 に答える
LRM (Language Reference Manual)の概要を説明しますが、読んでおいてください。すべてはIEEE Std 1800-2012 § 21.2表示システム タスクにあります(技術的には SystemVerilog ですが、これらの機能は同一です。)
$display
: 即値を表示- § 21.2.1表示タスクと書き込みタスク
$strobe
: 現在のタイムステップの最後に値を出力します- § 21.2.2ストローブ監視
$monitor
: 値が変更された場合、現在のタイムステップの最後に値を出力します。$monitor
一度だけ呼び出すことができます。順次呼び出しは前のものをオーバーライドします。- § 21.2.3継続的な監視
$write
: と同じ$display
ですが、改行で終了しません (\n
)- § 21.2.1表示タスクと書き込みタスク
例:
reg [3:0] a,b;
integer i;
initial begin
$monitor("monitor a:%h b:%h @ %0t", a, b, $time);
for(i=0; i<4; i=i+1) begin
$strobe("strobe a:%h b:%h @ %0t", a, b, $time);
$display("display a:%h b:%h @ %0t", a, b, $time);
case(i)
0 : a = 4;
1 : b = 1;
2 : begin end // do nothing
3 : {a,b} = 9;
endcase
$display("display a:%h b:%h @ %0t", a, b, $time);
#1;
end
end
出力: (印刷順序とそのモニターが時間 2 で表示されていないことに注意してください)
ディスプレイ a:xb:x @ 0
ディスプレイ a:4 b:x @ 0
モニター a:4 b:x @ 0
ストロボ a:4 b:x @ 0
ディスプレイ a:4 b:x @ 1
ディスプレイ a:4 b: 1 @ 1
モニター a:4 b:1 @ 1
ストロボ a:4 b:1 @ 1
ディスプレイ a:4 b:1 @ 2
ディスプレイ a:4 b:1 @ 2
ストロボ a:4 b:1 @ 2
ディスプレイ a :4 b:1 @ 3
ディスプレイ a:0 b:9 @ 3
モニター a:0 b:9 @ 3
ストロボ a:0 b:9 @ 3
Verilog/SystemVerilog には、よく整理されたイベント キューが含まれています。各タイムスタンプのすべてのステートメントは、このキューに従って実行されます。
- $display はACTIVE regionで実行されるため、非ブロッキング割り当て (INACTIVE 領域で実行される) がある場合、それは $display によって表示されません。
- $write はACTIVE regionでも実行されますが、別の行を挿入するには改行文字 (\n) を明示的に呼び出す必要があります。このシステムタスクは、一般的に for ループを使用して多次元配列を表示したい場合に使用されます。
- $strobe はMONITOR/POSTPONE regionで、つまりタイムスタンプの最後に実行されます。したがって、更新された値は $strobe によって表示されます。
- $monitor は、表示パラメータの 1 つが変更されるたびに表示されます。シミュレーションごとに 1 つの $monitor のみが使用されます。
この画像を見てください:VERILOG EVENT REGIONS
サンプルコードは、Display/Strobe/Monitorで入手できます。
このコードがそれを明確にすることを願っています。