系統(tǒng)任務(wù) | 調(diào)用格式 | 任務(wù)描述 |
---|---|---|
退出仿真 | $finish( type ) ; | 結(jié)束仿真,參數(shù) type 可選擇退出仿真時(shí)是否打印信息
type=0: 直接退出不打印 type=1: 打印仿真時(shí)間和該語(yǔ)句所在的位置行信息 type=2: 打印仿真時(shí)間、位置、存儲(chǔ)器和 CPU 時(shí)間的使用情況 |
暫停仿真 | $stop( type ) ; | 暫停仿真,用法格式與 $finish 相同 |
?$finish
? 與 ?$stop
? 都有讓仿真停止的功能,但他們還是有區(qū)別的。
?$finish
? 是結(jié)束本次仿真。?$stop
? 是暫停當(dāng)前的仿真。仿真暫停后通過(guò) Verilog 仿真工具或命令行還可以使仿真繼續(xù)進(jìn)行,而結(jié)束仿真后仿真無(wú)論如何也不能再進(jìn)行。?$stop
? 類似于 C 語(yǔ)言的斷點(diǎn)調(diào)試功能。
下面用仿真說(shuō)明 type 類型對(duì)應(yīng)的打印信息。
initial begin
forever begin
#100;
if ($time >= 10000) $finish(0) ;
//if ($time >= 10000) $finish(1) ;
//if ($time >= 10000) $finish(2) ;
end
end
?$finish(0)
?,仿真退出時(shí)不打印任何信息。
?$finish(1)
?,仿真退出時(shí)打印仿真時(shí)間和 ?$finish
? 所在的行信息,如下所示。
模塊 test 時(shí)間精度為 ns,但是仿真器時(shí)間精度為 ps,所以打印的時(shí)間信息相差 1000 倍。
?$finish(2)
?,仿真退出時(shí)不僅打印仿真時(shí)間和行信息,還打印 PC 機(jī)使用的時(shí)間以及及存儲(chǔ)器的使用情況,如下所示。
系統(tǒng)任務(wù) | 調(diào)用格式及說(shuō)明 |
---|---|
打印時(shí)間
單位和精度 |
$printtimescale( hierarchy ) ; |
該系統(tǒng)任務(wù)會(huì)按照如下格式打印 timescale 信息
TimeScale of ( hierarchy ) is 1 ( unit ) / 1 ( precision ) hierarchy 為模塊訪問(wèn)層次,可省略,此時(shí)打印當(dāng)前模塊的 timescale 信息 |
|
設(shè)置時(shí)間
單位和精度 |
$timeformat(unit_num, precision_num, suffix_string, min_field_width) |
unit_num,設(shè)置時(shí)間單位,默認(rèn)以 `timescale 為準(zhǔn)
precision_num, 設(shè)置時(shí)間單位中小數(shù)的有效位數(shù),默認(rèn)為 0 suffix_string, 設(shè)置時(shí)間后綴信息,例如 "ns" 等,默認(rèn)為空 min_field_width, 設(shè)置時(shí)間信息所占的字符節(jié)數(shù),默認(rèn)為 20 |
當(dāng)顯示任務(wù)(如 ?$display
?、?$monitor
? 等)和文件寫任務(wù)(如 ?$display
? 等)使用格式 "?%t
?" 進(jìn)行數(shù)據(jù)輸出時(shí),?$timeformat
? 可以指定時(shí)間單位信息的輸出格式。
?$timeformat
? 中 ?unit_num
?是使用有符號(hào)數(shù)來(lái)指定時(shí)間單位的,其對(duì)應(yīng)關(guān)系如下表所示:
unit_num | 時(shí)間單位 | unit_num | 時(shí)間單位 |
---|---|---|---|
0 | 1 s | -8 | 10 ns |
-1 | 100 ms | -9 | 1 ns |
-2 | 10 ms | -10 | 100 ps |
-3 | 1 ms | -11 | 10 ps |
-4 | 100 us | -12 | 1 ps |
-5 | 10 us | -13 | 100 fs |
-6 | 1 us | -14 | 10 fs |
-7 | 100 ns | -15 | 1 fs |
利用如下代碼對(duì)時(shí)間刻度的 2 個(gè)系統(tǒng)任務(wù)進(jìn)行簡(jiǎn)單的仿真。
//change timescale
initial begin
# 10 ;
//ps精度,小數(shù)為5位有效數(shù)字,單位后綴顯示"my-ps", 占15個(gè)字符大小的長(zhǎng)度
$timeformat(-12, 5, " my-ps", 15) ;
end
initial begin
# 5 ;
$printtimescale() ;
$display("Time before resetup: %t", $time);
# 10 ;
$printtimescale() ;
$display("Time after resetup: %t", $time);
end
仿真 log 如下所示。
由圖可以對(duì)比 ?$timeformat
? 設(shè)置前后時(shí)間的顯示格式。
此外,此過(guò)程中 timescale 始終是沒(méi)有變的,?$timeformat
? 只是改變了時(shí)間的顯示格式。
系統(tǒng)任務(wù)調(diào)用 | 說(shuō)明 |
---|---|
$time | 返回一個(gè) 64bit 整數(shù)型時(shí)間值 |
$stime | 返回一個(gè) 32bit 整數(shù)型時(shí)間值 |
$realtime | 返回一個(gè)實(shí)數(shù)型時(shí)間值,可以是浮點(diǎn)數(shù) |
仿真代碼如下:
initial begin
#10;
$display("$time output1: %t", $time);
$display("$stime output1: %t", $stime);
$display("$realtime output1: %t", $realtime);
#3.2;
$display("$time output2: %t", $time);
$display("$stime output2: %t", $stime);
$display("$realtime output2: %t", $realtime);
#5.6;
$display("$time output2: %t", $time);
$display("$stime output2: %t", $stime);
$display("$realtime output2: %t", $realtime);
end
仿真 log 如下所示。
由于仿真時(shí)間短,?$time
? 與 ?$stime
? 是沒(méi)有區(qū)別的。
但是 ?$realtime
? 會(huì)按照當(dāng)前的時(shí)間精度對(duì)仿真時(shí)間進(jìn)行準(zhǔn)確讀取,而 ?$time
? 和 ?$stime
? 會(huì)根據(jù)時(shí)間精度對(duì)當(dāng)前時(shí)間進(jìn)行四舍五入的讀取。
Verilog 還提供了交互任務(wù) ?$test$plusargs
? 和 ?$value$plusargs
? ,仿真時(shí)可通過(guò)命令行傳參的方式進(jìn)行參數(shù)的傳遞,為仿真調(diào)試提供了極大的便利。
系統(tǒng)任務(wù) | 調(diào)用格式 | 任務(wù)描述 |
---|---|---|
字符串傳參 | $test$plusargs( str ) ; | 仿真時(shí)通過(guò)命令行傳遞的字符串?dāng)?shù)據(jù)如果和 str 一致,則返回值為 1, 否則為 0。 |
數(shù)值傳參 | $value$plusargs( str, var ) ; | 仿真時(shí)通過(guò)命令行傳遞的字符串?dāng)?shù)據(jù)如果和 str 一致,則返回值為 1, 否則為 0。
需要在 str 內(nèi)部指定傳遞給 module 內(nèi) var 變量的類型,格式可參考顯示任務(wù) $display |
使用 ?$test$plusargs( str )
? 時(shí),只需在仿真命令行中加入"+str "即可。
使用 ?$value$plusargs( str,var )
? 時(shí),需要在 str 內(nèi)部指定傳遞參數(shù)時(shí)數(shù)值的類型。而在命令行傳遞參數(shù)時(shí),數(shù)值不需要添加任何有關(guān)進(jìn)制的說(shuō)明,只保留相關(guān)進(jìn)制的數(shù)值即可。命令行傳遞參數(shù)的格式需要參照 ?$value$plusargs
? 時(shí) str 聲明的格式。
下面用仿真說(shuō)明:
initial begin
if ($test$plusargs("DISPLAY_CTRL")) begin
$display("Display simulation information!!!");
end
end
reg [1:0] display_sel ;
initial begin
if ($value$plusargs("INFO_SEL=%b", display_sel)) begin
$display("Parameter transfer succeeds!!!");
end
else begin
display_sel = 2'b0 ;
end
end
initial begin
#1 ;
if (display_sel == 2'b01)
$display("You have selected W3cschool!!!");
else if (display_sel == 2'b10)
$display("You have selected Verilog!!!");
else if (display_sel == 2'b11)
$display("You have selected Me!!!");
else
$display("What do you really what???");
end
在仿真命令行中增加: +DISPLAY_CTRL +INFO_SEL=01
則仿真 log 如下,由此可知,字符串參數(shù)和二進(jìn)制參數(shù)均傳遞正確。
點(diǎn)擊這里下載源碼
更多建議: