Verilog 顯示任務(wù)

2022-05-20 14:37 更新

關(guān)鍵詞:$display, $write, $strobe, $monitor

Verilog 中主要用以下 4 種系統(tǒng)任務(wù)來顯示(打印)調(diào)試信息:?$display?, ?$write?, ?$strobe?, ?$monitor?。

$display

?$display? 使用方法和 C 語言中的 ?printf ?函數(shù)非常類似,可以直接打印字符串,也可以在字符串中指定變量的格式對相關(guān)變量進(jìn)行打印。例如:

$display("This is a test.");   //直接打印字符串
$display("This is a test number: %b.", num); //打印變量 num 為二進(jìn)制格式


如果沒有指定變量的顯示格式,變量值會根據(jù)在字符串的位置顯示出來,相當(dāng)于參與了字符串連接。例如:

$display("This is a test number: ", num, "!!!");


如果沒有指定格式,?$display? 默認(rèn)顯示是十進(jìn)制。?$displayb?, ?$displayo?, ?$displayh? 顯示格式分別為二進(jìn)制、八進(jìn)制、十六進(jìn)制。同理也有 ?$writeb?, ?$writeo?, ?$writeh?, ?$strobeb? 等。

下表是常用的格式說明。

%h 或 %H 十六進(jìn)制格式輸出 %c 或 %C ASCII 碼格式輸出
%d 或 %D 十進(jìn)制格式輸出 %e 或 %E 指數(shù)格式輸出
%o 或 %O 八進(jìn)制格式輸出 %f 或 %F 浮點(diǎn)數(shù) (real 型) 格式輸出
%b 或 %B 二進(jìn)制格式輸出 %t 或 %T 當(dāng)前時間格式輸出
%s 或 %S 字符串格式輸出 %m 或 %M 當(dāng)前層次訪問路徑輸出

還可以使用轉(zhuǎn)義字符顯示特殊字符,例如:

\n 換行符 %% 百分號"%"
\t 制表符(Tab 鍵) \0 八進(jìn)制代表的字符
\\ 反斜杠"\"符 \0x 十六進(jìn)制代表的字符
\" 雙引號    

$write

?$wirte? 使用方法與 ?$display? 完全一樣,只是前者會在每次顯示信息完畢后不會自動換行,后者會自動換行。當(dāng)輸出后不需要換行時,可以使用顯示任務(wù) ?$write?。

$write("This is a test");
$write("number: %b", num);
$write("!!!\n");


$strobe

?$strobe? 為選通顯示任務(wù)。?$strobe? 使用方法與 ?$display? 一致,但打印信息的時間和 ?$display? 有所差異。

當(dāng)許多語句與 ?$display? 任務(wù)在同一時間內(nèi)執(zhí)行時,這些語句和 ?$display? 的執(zhí)行順序是不確定的,一般按照程序的順序結(jié)構(gòu)執(zhí)行。

?$strobe? 則是在其他語句執(zhí)行完畢之后,才執(zhí)行顯示任務(wù)。例如:

   reg [3:0]  a ;
   initial begin
      a = 1 ;
      #1 ;
      a <= a + 1 ;
      //第一次顯示
      $display("$display excuting result: %d.", a);
      $strobe("$strobe excuting result: %d.", a);
      #1 ;
      $display();
      //第二次顯示
      $display("$display excuting result: %d.", a);
      $strobe("$strobe excuting result: %d.", a);
   end

執(zhí)行結(jié)果如下所示。

執(zhí)行第一次顯示任務(wù)時,非阻塞賦值與 ?$display? 同時執(zhí)行,?$display? 顯示賦值之前的變量值,而 ?$strobe? 顯示賦值之后的變量值。這正體現(xiàn)了 ?$strobe? 的選通顯示特性。


再看一個例子:

   integer  i ;
   initial begin
      for (i=0; i<4; i=i+1) begin
         $display("Run times of $display: %d.", i);
         $strobe("Run times of $strobe: %d.", i);
      end
   end

執(zhí)行結(jié)果如下:

?$display? 按照程序結(jié)構(gòu),執(zhí)行顯示操作 4 次。而此循環(huán)語句是在 0 時刻執(zhí)行的,所以 ?$strobe? 顯示的變量值是循環(huán)結(jié)束時變量的結(jié)果,即 i=4 退出循環(huán)后 ?$strobe? 才會執(zhí)行。這就體現(xiàn)了顯示任務(wù) ?$strobe? 的時刻顯示特性。


$monitor

?$monitor? 為監(jiān)測任務(wù),用于變量的持續(xù)監(jiān)測。只要變量發(fā)生了變化,?$monitor? 就會打印顯示出對應(yīng)的信息。

例如:

   reg [3:0]    cnt ;
   initial begin
      cnt = 3 ;
      forever begin
         # 5 ;
         if (cnt<7) cnt = cnt + 1 ;
      end
   end

   initial begin
      $monitor("Counter change to value %d at the time %t.", cnt, $time);
   end


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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號