表示と監視
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 と $monitor
| $display | $monitor | |
|---|---|---|
| 表示されるタイミング | 実行時に1回 | 変数が変わるたび |
| 表示回数 | 呼び出した回数だけ | 継続的(変化するまで) |
| 用途 | ヘッダー、テストメッセージ | 変化する信号の追跡 |
よく使われるフォーマット指定子
| 指定子 | 意味 | 例 |
|---|---|---|
%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"$monitorを追加して、いずれかの信号が変化するたびに時刻、x、y、zを出力します。形式:"Time %0t: x=%b, y=%b, z=%b"- 最後に
$displayを追加して、"Test complete"を出力します。
自分で試してみよう
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: time、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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ