Verilog 中主要用以下 4 種系統(tǒng)任務(wù)來顯示(打印)調(diào)試信息:?$display
?, ?$write
?, ?$strobe
?, ?$monitor
?。
?$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)制代表的字符 |
\" | 雙引號 |
?$wirte
? 使用方法與 ?$display
? 完全一樣,只是前者會在每次顯示信息完畢后不會自動換行,后者會自動換行。當(dāng)輸出后不需要換行時,可以使用顯示任務(wù) ?$write
?。
$write("This is a test");
$write("number: %b", num);
$write("!!!\n");
?$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
? 為監(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)擊這里下載源碼
更多建議: