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

2023-02-28 14:12 更新

仿真控制:$finish, $stop 

系統(tǒng)任務(wù) 調(diào)用格式 任務(wù)描述
退出仿真 $finish( type ) ; 結(jié)束仿真,參數(shù) type 可選擇退出仿真時是否打印信息
type=0: 直接退出不打印
type=1: 打印仿真時間和該語句所在的位置行信息
type=2: 打印仿真時間、位置、存儲器和 CPU 時間的使用情況
暫停仿真 $stop( type ) ; 暫停仿真,用法格式與 $finish 相同

?$finish? 與 ?$stop? 都有讓仿真停止的功能,但他們還是有區(qū)別的。

?$finish? 是結(jié)束本次仿真。?$stop? 是暫停當(dāng)前的仿真。仿真暫停后通過 Verilog 仿真工具或命令行還可以使仿真繼續(xù)進行,而結(jié)束仿真后仿真無論如何也不能再進行。?$stop? 類似于 C 語言的斷點調(diào)試功能。

下面用仿真說明 type 類型對應(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)?,仿真退出時不打印任何信息。

?$finish(1)?,仿真退出時打印仿真時間和 ?$finish? 所在的行信息,如下所示。

模塊 test 時間精度為 ns,但是仿真器時間精度為 ps,所以打印的時間信息相差 1000 倍。


?$finish(2)?,仿真退出時不僅打印仿真時間和行信息,還打印 PC 機使用的時間以及及存儲器的使用情況,如下所示。


時間格式:$printtimescale, $timeformat

系統(tǒng)任務(wù) 調(diào)用格式及說明
打印時間
單位和精度
$printtimescale( hierarchy ) ;
  該系統(tǒng)任務(wù)會按照如下格式打印 timescale 信息
TimeScale of ( hierarchy ) is 1 ( unit ) / 1 ( precision )
hierarchy 為模塊訪問層次,可省略,此時打印當(dāng)前模塊的 timescale 信息
設(shè)置時間
單位和精度
$timeformat(unit_num, precision_num, suffix_string, min_field_width)
  unit_num,設(shè)置時間單位,默認以 `timescale 為準(zhǔn)
precision_num, 設(shè)置時間單位中小數(shù)的有效位數(shù),默認為 0
suffix_string, 設(shè)置時間后綴信息,例如 "ns" 等,默認為空
min_field_width, 設(shè)置時間信息所占的字符節(jié)數(shù),默認為 20

當(dāng)顯示任務(wù)(如 ?$display?、?$monitor? 等)和文件寫任務(wù)(如 ?$display? 等)使用格式 "?%t?" 進行數(shù)據(jù)輸出時,?$timeformat? 可以指定時間單位信息的輸出格式。

?$timeformat? 中 ?unit_num ?是使用有符號數(shù)來指定時間單位的,其對應(yīng)關(guān)系如下表所示:

unit_num 時間單位 unit_num 時間單位
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

利用如下代碼對時間刻度的 2 個系統(tǒng)任務(wù)進行簡單的仿真。

   //change timescale
   initial begin
      # 10 ;
      //ps精度,小數(shù)為5位有效數(shù)字,單位后綴顯示"my-ps", 占15個字符大小的長度
      $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 如下所示。

由圖可以對比 ?$timeformat? 設(shè)置前后時間的顯示格式。

此外,此過程中 timescale 始終是沒有變的,?$timeformat? 只是改變了時間的顯示格式。


仿真時間:$time, $stime, $realtime

系統(tǒng)任務(wù)調(diào)用 說明
$time 返回一個 64bit 整數(shù)型時間值
$stime 返回一個 32bit 整數(shù)型時間值
$realtime 返回一個實數(shù)型時間值,可以是浮點數(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 如下所示。

由于仿真時間短,?$time? 與 ?$stime? 是沒有區(qū)別的。

但是 ?$realtime? 會按照當(dāng)前的時間精度對仿真時間進行準(zhǔn)確讀取,而 ?$time? 和 ?$stime? 會根據(jù)時間精度對當(dāng)前時間進行四舍五入的讀取。


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

Verilog 還提供了交互任務(wù) ?$test$plusargs? 和 ?$value$plusargs? ,仿真時可通過命令行傳參的方式進行參數(shù)的傳遞,為仿真調(diào)試提供了極大的便利。

系統(tǒng)任務(wù) 調(diào)用格式 任務(wù)描述
字符串傳參 $test$plusargs( str ) ; 仿真時通過命令行傳遞的字符串?dāng)?shù)據(jù)如果和 str 一致,則返回值為 1, 否則為 0。
數(shù)值傳參 $value$plusargs( str, var ) ; 仿真時通過命令行傳遞的字符串?dāng)?shù)據(jù)如果和 str 一致,則返回值為 1, 否則為 0。
需要在 str 內(nèi)部指定傳遞給 module 內(nèi) var 變量的類型,格式可參考顯示任務(wù) $display

使用 ?$test$plusargs( str )? 時,只需在仿真命令行中加入"+str "即可。

使用 ?$value$plusargs( str,var )? 時,需要在 str 內(nèi)部指定傳遞參數(shù)時數(shù)值的類型。而在命令行傳遞參數(shù)時,數(shù)值不需要添加任何有關(guān)進制的說明,只保留相關(guān)進制的數(shù)值即可。命令行傳遞參數(shù)的格式需要參照 ?$value$plusargs? 時 str 聲明的格式。

下面用仿真說明:

   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ù)和二進制參數(shù)均傳遞正確。

1653017768824147

點擊這里下載源碼


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號