Verilog 其他系統(tǒng)任務(wù)

2023-02-28 14:12 更新

仿真控制:$finish, $stop 

系統(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ǔ)器的使用情況,如下所示。


時(shí)間格式:$printtimescale, $timeformat

系統(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í)間的顯示格式。


仿真時(shí)間:$time, $stime, $realtime

系統(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)行四舍五入的讀取。


命令行傳參:$test$plusargs, $value$plusargs

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ù)均傳遞正確。

1653017768824147

點(diǎn)擊這里下載源碼


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)