Verilog表示タスクのマスター:効率的なデバッグとログ出力
表示システムタスクは、主にシミュレーションログからシミュレーションの流れを追跡するための情報およびデバッグメッセージを表示するために使用され、デバッグを高速化するのにも役立ちます。表示タスクにはさまざまなグループがあり、値を出力するフォーマットも複数あります。
Display/Writeタスク
構文
$displayと$writeの両方は、引数リストに出現する順序で引数を表示します。
$display(<引数リスト>);
$write(<引数リスト>);
$writeは文字列の末尾に改行文字\nを追加しませんが、$displayは追加します。これは以下の例からわかります。
例
module tb;
initial begin
$display ("This ends with a new line ");
$write ("This does not,");
$write ("like this. To start new line, use newline char ");
$display ("This always start on a new line !");
end
endmodule
ncsim> run This ends with a new line This does not,like this. To start new line, use newline char Hi there ! ncsim: *W,RNQUIE: Simulation is complete.
Verilogストローブ
$strobeは、現在のデルタタイムステップの末尾での変数の最終値を出力し、$displayと同様のフォーマットを持ちます。
module tb;
initial begin
reg [7:0] a;
reg [7:0] b;
a = 8'h2D;
b = 8'h2D;
#10;
// シミュレーションが10nsに達するまで待機
b <= a + 1; // a+1の値をbに代入
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1;
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
end
endmodule
$strobeが時間10nsでの変数bの最終更新値0x2Eを示し、$displayがそれを次のシミュレーションデルタの11nsで取得していることに注意してください。
ncsim> run [$display] time=10 a=0x2d b=0x2d [$strobe] time=10 a=0x2d b=0x2e [$display] time=11 a=0x2d b=0x2e [$strobe] time=11 a=0x2d b=0x2e ncsim: *W,RNQUIE: Simulation is complete. ncsim> exit
Verilog連続モニタ
$monitorは、引数リスト内の変数または式が変化するたびに、自動的に変数または式の値を出力します。これは、引数のいずれかが更新されるたびに$displayを呼び出すのと同様の効果を得られます。
module tb;
initial begin
reg [7:0] a;
reg [7:0] b;
a = 8'h2D;
b = 8'h2D;
#10;
// シミュレーションが10nsに達するまで待機
b <= a + 1; // a+1の値をbに代入
$monitor ("[$monitor] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1 b <= 8'hA4;
#5 b <= a - 8'h33;
#10 b <= 8'h1;
end
endmodule
$monitorは、メインスレッドのバックグラウンドで実行されるタスクのように生成され、引数変数の値変化を監視して表示します。新しい$monitorタスクはシミュレーション中に何度でも発行できます。
ncsim> run [$monitor] time=10 a=0x2d b=0x2e [$monitor] time=11 a=0x2d b=0xa4 [$monitor] time=16 a=0x2d b=0xfa [$monitor] time=26 a=0x2d b=0x1 ncsim: *W,RNQUIE: Simulation is complete.
Verilogフォーマット指定子
表示関数内で変数を出力するには、各変数に適切なフォーマット指定子を指定する必要があります。
| 引数 | 説明 |
|---|---|
| %h, %H | 16進数形式で表示 |
| %d, %D | 10進数形式で表示 |
| %b, %B | 2進数形式で表示 |
| %m, %M | 階層名を表示 |
| %s, %S | 文字列として表示 |
| %t, %T | 時間形式で表示 |
| %f, %F | 'real'を10進数形式で表示 |
| %e, %E | 'real'を指数形式で表示 |
module tb;
initial begin
reg [7:0] a;
reg [39:0] str = "Hello";
time cur_time;
real float_pt;
a = 8'h0E;
float_pt = 3.142;
$display ("a = %h", a);
$display ("a = %d", a);
$display ("a = %b", a);
$display ("str = %s", str);
#200 cur_time = $time;
$display ("time = %t", cur_time);
$display ("float_pt = %f", float_pt);
$display ("float_pt = %e", float_pt);
end
endmodule
ncsim> run a = 0e a = 14 a = 00001110 str = Hello time = 200 float_pt = 3.142000 float_pt = 3.142000e+00 ncsim: *W,RNQUIE: Simulation is complete.
Verilogエスケープシーケンス
一部の文字は、改行、タブ、フォームフィードなど他の表示目的を表すため特別と見なされます。これらの特殊文字を出力するには、各出現をエスケープする必要があります。
| 引数 | 説明 |
|---|---|
| \n | 改行文字 |
| \t | タブ文字 |
| \\ | バックスラッシュ文字 |
| \" | ダブルクォート文字 |
| %% | パーセント文字 |
module tb;
initial begin
$write ("Newline character \n");
$display ("Tab character \tstop");
$display ("Escaping \" %%");
/*
// コンパイルエラー
$display ("Without escaping ");
// ERROR: 未終端文字列
$display ("Without escaping "");
// ERROR: 未終端文字列
*/
end
endmodule
ncsim> run Newline character Tab character stop Escaping " % ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilog `ifdef:条件付きコンパイルの解説
- Verilog階層参照スコープのマスター:モジュールとブロックでの名前衝突回避
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog表示タスクのマスター:効率的なデバッグとログ出力
- Verilog数学関数のマスター:効率的なハードウェア設計のために