Verilog本質上也是一門高級語言,因而也提供了豐富打印信息、輸出信息的系統函數。 Verilog提供的打印系統函數分為三類: 顯示/寫系統函數(Display and Write tasks) 脈沖選擇監視系統函數(strobed monitoring tasks) 連續監視系統函數(continuous monitoring tasks) 顯示/寫系統函數 這類函數包括$display、$displayb、$displayo、$displayh、$write、$writeb、$ writeo、$writeh等八個函數。其使用語法如下: 系統函數名(變量列表); 變量列表就是需要輸出的信息,該變量列表可以是變量名、表達式、雙引號括起來的字符串、以及這三種形式的組合。變量列表也可以為空。這時,$display會輸出一個回車符(就是開始新的一行),而$write則相當于不進行任何操作。 $display 系列和$write系列除了一點差別外完全一致,其差異在于$display會在變量列表后面自動增加一個回車符,而$write則沒有該功能,完全按照變量列表指示的內容輸出。當變量列表為空時,$display輸出一個回車符,而$write則相當于不進行任何操作。 Verilog的這些打印系統函數的使用同其他高級語言比如C中的打印函數很類似。這些函數支持“格式化輸出”,也是在雙引號括起來的變量中加入轉義符號實現的。對于變量列表中的變量或者常量,當指定了輸出格式時,這八個函數沒有差別,都將以指定格式輸出其值;當沒有指定輸出格式時,各函數以默認的形式輸出該變量或者常量的值。 下表給出各個函數默認的輸出格式: 系統函數 默認制式 例子(a[7:0]=31) $display、$write 十進制 $write(12,” and ”, a[7:0]); $displayb、$writeb 二進制 $writeb(12, ” and ”, a[7:0]); $displayo、$writeo 八進制 $writeo(12, ” and ”, a[7:0]); $displayh、$writeh 十六進制 $writeh(12, ” and ”, a[7:0]); “格式化輸出”功能需要使用轉義符。除了增加部分跟硬件設計相關的轉義符外,Verilog的這些系統函數中的轉義符同其他高級語言中的定義和使用基本相同。 Verilog的轉義符分為兩大類:以”\\”引導的和以”%”引導的。通常,以”%”引導的轉義符用于指定變量列表中的變量、常量、表達式的格式化輸出;以”\\”引導的表示其他的一些格式化輸出功能,通常是比較“特殊”的功能,比如輸出一個“TAB”,或者輸出”\\”本身,以及輸出”%”本身等。 下表給出了Verilog中基本的轉義符定義和意義說明: 轉義符 意義說明 %d 以及 %D 以十進制格式輸出 %b 以及 %B 以二進制格式輸出 %o 以及 %O 以八進制格式輸出 %h 以及 %H 以十六進制格式輸出 %s 以及 %S 以字符串格式輸出 %c 以及 %C 以ASCII碼格式輸出 %v 以及 %V 輸出線網類型變量的強度 %m 以及 %M 輸出層次名 %t 以及 %T 以當前時間格式輸出 %e 以及 %E 以指數表示方式輸出實數(real型) %f 以及 %F 以十進制數表示方式輸出實數(real型) %g 以及 %G 以十進制數或者以指數表示方式輸出實數。兩種輸出格式中,哪種占用更少的寬度,就使用哪一種。 \\n 開始新行(“回車”功能) \\t 輸出一個 TAB \\” 輸出 ” 本身 \\\\ 輸出 \\ 本身 %% 輸出 % 本身 \\xyz xyz表示一個八進制數。\\xyz表示輸出八進制數xyz的值對應的ASCII碼符號。比如,”\\123”,應該輸出的為符號“S”。 例子2-1給出了這些轉義符的基本使用: // Filename: exe_2_1.v // This module is writen by YiTurn Zhao // Module Purpose : $display 和 $write的基本用法 module exe_2_1(); // reg [7:0] a; initial begin a = 31; abcd = 50; $display(" Using $display, a = ",a, " And 12 = ",12); $displayb(" Using $displayb, a = ",a, " And 12 = ",12); $displayo(" Using $displayo, a = ",a, " And 12 = ",12); $displayh(" Using $displayh, a = ",a, " And 12 = ",12); $writeo(" \\nUsing Formatted $writeh, a = %d And 12 = %H",a,12); $writeh(" Using Formatted $writeh, a = %d",a, " And 12 = %H",12,"\\n"); $display("Print \\"%%\\",\\t\\"%%%%\\" should be used."); $display("Use %%C or %%c: a's value %d %C",a,a); $display("Use %%S or %%s: a's value %d %s",a,a); $display("Use %%E or %%e: 10000.8 can be writen as %e ",10000.8); $display("Use %%F or %%f: 1.023E+8 can be writen as %f ",1.023E+8); $display("Use %%G or %%g: 1.023E+8 can be writen as %g ",1.023E+8); $display("Use \\\\xyz : Character \\101's ASCII value is 3'O101"); $display("Use \\\\xyz : Character \\053's ASCII value is 3'O53"); #200 $finish; end endmodule 注意: 1,在Verilog中,轉義符一定是使用在雙引號括起來的字符串中! 2,”\\” 和”%”后跟的不是前述指定的符號時,行為跟仿真器的設計有關。比如,“\\N”實現的不是換行功能,但不同仿真器對其解釋不同。同樣,對于” \\%”、”%\\”等1364-2001標準未規定的格式,不同仿真器也可能進行不同的處理。嚴格的說,沒有規定的轉義表達式應該不能使用,比如“ \\%”這一形式。一旦使用,應該通不過編譯,并報告錯誤信息。但是通過幾個仿真器的仿真發現,通常,”\\%”是允許的,推廣之,發現”\\”后跟的如果不是表格中規定的轉義符,”\\”將被忽略,而直接輸出之后的信息。比如”\\%”就輸出”%”符號,”\\N”就輸出”N”符號。但是”%\\”是不允許的,推廣之,發現”%”后跟的如果不是表格中規定的轉義符,將報告錯誤。 3,除”%%”外,”%”引導的轉義符的使用必須和對應的變量、或者表達式匹配使用。對應于某一個轉義符的變量為空時,可以用兩個”,”將的空格來表示。參見例2-2。 4,”%C”、”%S”、”\\xyz” 等形式的轉義符都跟ASCII碼有關。”\\xyz”輸出值為八進制數”xyz”的ASCII碼,它不需要對應的變量(或者常量)列表。”%C”、”%s”也是輸出一個ASCII符號,其值為變量列表中對應的變量、常量或者表達式的值,因此需要在變量列表中提供相應的變量、常量或者表達式。 同其他高級語言相比,Verilog提供了幾種跟硬件設計相關的特殊輸出格式轉義符:%v、%m、%t。 %v用于打印一個線網類型變量的信號強度,它不能打印矢量變量的信號強度,而只能打印標量變量,或者矢量變量的指定位的信號強度。信號強度用3個符號輸出表示,前兩個符號表示信號強度,而第三個符號表示信號的邏輯值。信號強度和邏輯值的意義分別如下面兩個表所示: 信號邏輯值表示: 邏輯值 表示意義 0 表示邏輯0值 1 表示邏輯1值 X 表示邏輯不定態 Z 表示邏輯高阻態 L 表示邏輯0值,或者邏輯高阻態 H 表示邏輯1值,或者邏輯高阻態 信號強度表示: 標記符 強度名 強度值表示 Su 電源級驅動(Supply drive) 7 St 強驅動(Strong drive) 6 Pu 上拉級驅動(Pull drive) 5 La 大容性(Large capacitor) 4 We 弱驅動(Weak drive) 3 Me 中級容性(Medium capacitor) 2 Sm 小容性(Small capacitor) 1 Hi 高容性(High capacitor) 0 用%v打印一個信號的強度時,前兩個符號除了用上表中的信號強度“標志符”表示信號強度外,也可以用兩個數字表示信號強度。關于信號強度和邏輯值的建模在后續章節進行詳細介紹。 使用%m,可以打印當前打印語句所在的模塊層次。 %t 通常用于打印當前的仿真時間,當然也可以用于打印其他數據。該轉義符表示把對應的變量使用當前使用的時間表示格式進行打印。Verilog提供系統函數$time獲得當前的仿真時間信息,該系統函數輸出值為64比特表示的整數。Verilog還提供系統函數$timeformat用于設定當前的時間格式。關于$time和$timeformat的使用也放在后續章節說明。 例2-3為這幾個轉義符簡單使用的一個例子。 // Filename: exe_2_3.v // This module is writen by YiTurn Zhao // Module Purpose : $display 和 $write的部分特殊功能 module exe_2_3(); reg [7:0] a; integer i; wire x; pulldown(x); initial begin #2; $display("%m"); $display("Simulation Time now is : %t",$time); $display("%%t Usage 2:%t",200); $display("x's strength is : %v",x); end exe_2_3_sub exe_2_3_sub(); endmodule module exe_2_3_sub; wire [1:0] x; initial begin # 4; $display("%m"); $display("Simulation Time now is : %t",$time); $display("x's strngth is :%v",x); end endmodule [em07][em07][em07][em07][em07] |