VerilogとSystem Verilogでは、現在のシミュレーション時間は$realtimeで取得できます。これを$display()で表示するにはフォーマット指定子の%tを使用します。
`timescale 1ps/1ps
module top();
initial begin
#10
$display("Current time = %t", $realtime);
end
endmodule
ただし、デフォルトでは時間の単位が表示されません。
Current time = 10
これを指定するには$timeformat()を使用します。
ちなみにUVMで`uvm_info()等のメッセージ表示マクロを使用すると、その時点のシミュレーション時間が表示されますが、これも$timeformat()の指定に従います。上記の通りVerilogのデフォルトでは時間単位が表示されませんので、UVMでもデフォルトでは表示されません。
#書式
$timeformatの書式は以下の通りです。
$timeformat(units_number, precision_number, suffix_string, minimum_field_witdh);
- units_number
- 表示される時間の小数点の位置を指定します。現在時間が1秒の場合、0指定で1, -3指定で1000と表示されます。従ってns単位で表示させたい場合-9、ps単位で表示させたい場合は-12を指定します。
- precision_number
- 小数点以下の表示桁数を指定します
- suffix_string
- 時間表示の数値の後に表示する時間単位を文字列で指定します。"ms", "us", "ns"等。
- minimum_field_width
- 表示する文字数の最小幅を指定します。suffix_stringで指定した文字もカウントされます。表示するべき文字数がこの値よりも少ない場合、その分だけ頭にスペースが挿入されます。逆に多い場合、この値を超えて必要な分だけ表示されます。
- Verilog (IEEE Std 1364-2005)
- 17.3.2 $timeformat
- System verilog (IEEE Std 1800-2017)
- 20.4.2 $timeformat
#実行例
実際にプログラムとその結果を比較すると分かりやすいと思いますので、以下にサンプルプログラムとその結果を示します。
`timescale 1ps/1ps
module top();
initial begin
#3000
$display("=====Test 0: Default format=====");
$display("Default format: Current time=%t", $realtime);
// Time unit
$display("=====Test 1: Time Unit=====");
$timeformat(-12, 3, " ps", 12);
$display("Test 1-1 : Current time=%t", $realtime);
$timeformat(-9, 3, " ns", 12);
$display("Test 1-2 : Current time=%t", $realtime);
$timeformat(-6, 3, " us", 12);
$display("Test 1-3 : Current time=%t", $realtime);
$timeformat(-3, 3, " ms", 12);
$display("Test 1-4 : Current time=%t", $realtime);
// Precesion
$display("=====Test 2: Precision=====");
$timeformat(-3, 0, " ms", 12);
$display("Test 2-1 : Current time=%t", $realtime);
$timeformat(-3, 3, " ms", 12);
$display("Test 2-2 : Current time=%t", $realtime);
$timeformat(-3, 6, " ms", 12);
$display("Test 2-3 : Current time=%t", $realtime);
// Field Width
$display("=====Test 3: Field Width=====");
$timeformat(-9, 2, " ns", 6);
$display("Test 3-1 : Current time=%t", $realtime);
$timeformat(-9, 2, " ns", 7);
$display("Test 3-2 : Current time=%t", $realtime);
$timeformat(-9, 2, " ns", 8);
$display("Test 3-3 : Current time=%t", $realtime);
$timeformat(-9, 2, " ns", 9);
$display("Test 3-4 : Current time=%t", $realtime);
end
endmodule
=====Test 0: Default format=====
Default format: Current time= 3000
=====Test 1: Time Unit=====
Test 1-1 : Current time= 3000.000 ps
Test 1-2 : Current time= 3.000 ns
Test 1-3 : Current time= 0.003 us
Test 1-4 : Current time= 0.000 ms
=====Test 2: Precision=====
Test 2-1 : Current time= 0 ms
Test 2-2 : Current time= 0.000 ms
Test 2-3 : Current time= 0.000003 ms
=====Test 3: Field Width=====
Test 3-1 : Current time=3.00 ns
Test 3-2 : Current time=3.00 ns
Test 3-3 : Current time= 3.00 ns
Test 3-4 : Current time= 3.00 ns
#LRM