Verilog 表示タスク
表示システム タスクは、主に情報メッセージとデバッグ メッセージを表示して、ログ ファイルからシミュレーションの流れを追跡するために使用され、デバッグを高速化するのにも役立ちます。値を出力できる表示タスクと形式には、さまざまなグループがあります。
タスクの表示/書き込み
構文
両方 $display
と $write
引数リストに表示される順序で引数を表示します。
$display(<list_of_arguments>);
$write(<list_of_arguments>);
$write
改行文字
を追加しません $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; // Wait till simulation reaches 10ns
b <= a + 1; // Assign a+1 value to 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
に注意してください 変数 b の最終更新値を表示します 0x2E である時間 10ns 、および $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; // Wait till simulation reaches 10ns
b <= a + 1; // Assign a+1 value to 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
task は、シミュレーション中に何度でも発行できます。
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 | バイナリ形式で表示 |
%m, %M | 表示階層名 |
%s, %S | 文字列として表示 |
%t, %T | 時間形式で表示 |
%f, %F | 'real' を 10 進形式で表示 |
%e, %E | 「実数」を指数形式で表示 |
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 エスケープ シーケンス
一部の文字は、改行、タブ、フォーム フィードなどの他の表示目的を表すため、特別と見なされます。これらの特殊文字を印刷するには 、そのような文字の出現ごとにエスケープする必要があります .
引数 | 説明 |
---|---|
改行文字 | |
タブ文字 | |
キャラクター | |
" | " 文字 |
%% | % 文字 |
module tb;
initial begin
$write ("Newline character
");
$display ("Tab character stop");
$display ("Escaping " %%");
/*
// Compilation errors
$display ("Without escaping "); // ERROR : Unterminated string
$display ("Without escaping ""); // ERROR : Unterminated string
*/
end
endmodule
シミュレーションログ ncsim> run Newline character Tab character stop Escaping " % ncsim: *W,RNQUIE: Simulation is complete.
Verilog