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