Display と Monitor
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 75/90。
$display と $monitor は、シミュレーションから情報を出力するために使用されるシステムタスクです。これらは、設計の内部で何が起きているかを確認するのに役立ちます。
$display
$display は、実行された瞬間にメッセージを一度だけ表示します。
構文:
$display("message", variables);例:
initial begin
$display("Simulation started");
#10;
$display("Time 10");
#10;
$display("Time 20");
end出力:
Simulation started
Time 10
Time 20$monitor
$monitor は、変数のいずれかが変化するたびに自動的にメッセージを表示します。
構文:
$monitor("message", variables);例:
initial begin
a = 0; b = 0;
$monitor("Time %0t: a=%b, b=%b", $time, a, b);
#10 a = 1;
#10 b = 1;
#10 a = 0;
end出力:
Time 0: a=0, b=0
Time 10: a=1, b=0
Time 20: a=1, b=1
Time 30: a=0, b=1$display vs $monitor
| $display | $monitor | |
|---|---|---|
| 表示のタイミング | 実行時に一度だけ | 変数が変化するたびに |
| 出力回数 | 呼び出した回数分 | 継続的に(変更されるまで) |
| 用途 | ヘッダー、テストメッセージ | 変化する信号の追跡 |
一般的な書式指定子
| 指定子 | 意味 | 例 |
|---|---|---|
%b | 2進数 | $display("%b", a); |
%d | 10進数 | $display("%d", count); |
%h | 16進数 | $display("%h", data); |
%t | 時間 | $display("%t", $time); |
%0t | 時間(スペースなし) | $display("%0t", $time); |
%s | 文字列 | $display("%s", "Hello"); |
重要なルール
| ルール | 説明 |
|---|---|
$display は一度だけ出力します | ヘッダーや最終結果に適しています |
$monitor は値が変化したときに出力します | 信号の監視に適しています |
有効な $monitor は1つだけです | 最後のものが以前のものを上書きします |
停止するには $finish を使用します | そうしないと、シミュレーションが永久に実行される可能性があります |
チャレンジ
このテストベンチに、不足している $display および $monitor ステートメントを追加してください。
作業内容:
- ヘッダーを出力するために
$displayを追加してください: "Testing OR Gate" - 信号が変化するたびに時間、x、y、zを出力するために
$monitorを追加してください。フォーマット: "Time %0t: x=%b, y=%b, z=%b" - 最後に "Test complete" と出力するために
$displayを追加してください
チートシート
$display は実行時に一度だけ表示されます。$monitor は変数のいずれかが変化するたびに自動的に表示されます。
$display("message", variables);
$monitor("message", variables);例:
initial begin
$display("Simulation started");
$monitor("Time %0t: a=%b, b=%b", $time, a, b);
#10 a = 1;
#10 b = 1;
end一般的なフォーマット指定子:
%b— 2進数%d— 10進数%h— 16進数%t/%0t— 時刻(パディングあり/なし)%s— 文字列
主なルール:
- 一度にアクティブにできる
$monitorは1つだけです。最後に呼び出されたものが以前のものを上書きします。 - シミュレーションを停止するには
$finishを使用します。
自分で試してみよう
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
// TODO: $display ヘッダー "Testing OR Gate" を追加
// TODO: 時間、x、y、z を追跡するための $monitor を追加
// フォーマット: "Time %0t: x=%b, y=%b, z=%b"
// 入力信号(スティミュラス)を適用
x = 0; y = 0; #10;
x = 0; y = 1; #10;
x = 1; y = 0; #10;
x = 1; y = 1; #10;
// TODO: $display "Test complete" を追加
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。