




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第6章 結構語句、系統任務、函數語句和顯示系統任務26.1 結構說明語句Verilog語言中的任何過程模塊都從屬于以下四種結構的說明語句。(1)initial說明語句(2) always說明語句(3) task說明語句(4) function說明語句3initial和always說明語句在仿真的一開始即開始執行。initial語句只執行一次。相反,always語句則是不斷地重復執行,直到仿真過程結束。always語句后面跟著的過程塊是否運行,則要看它的觸發條件是否滿足,如滿足則運行過程塊一次,再次滿足再運行一次,直至仿真過程結束。在一個模塊中,使用initial和always語句的次數是不受
2、限制的。task和function語句可以在程序模塊中的一處或多處調用。46.1.1 initial語句initial語句的格式如下:initialbegin 語句1; 語句2; . 語句n;end5例6.1 用initial 塊對存儲器變量賦初始值initialbegin areg=0; /初始化寄存器areg for(index=0;indexsize;index=index+1) memoryindex=0; /初始化一個memoryend6例6.2 用initial語句來生成激勵波形initialbegin inputs = b000000; /初始時刻為0 #10 inputs =
3、b011001; #10 inputs = b011011; #10 inputs = b011000; #10 inputs = b001000;end7always語句由于其不斷活動的特性,只有和一定的時序控制結合在一起才有用。如果一個always語句沒有時序控制,則這個always語句將會使仿真器產生死鎖。always areg = areg; 但如果加上時序控制,則這個always語句將變為一條非常有用的描述語句。 always #half_period areg = areg;8例6.5reg7:0 counter; reg tick; always (posedge areg) b
4、egin tick = tick; counter = counter + 1; end9always 的時間控制可以是沿觸發也可以是電平觸發的,可以單個信號也可以多個信號,中間需要用關鍵字 or 連接。always (posedge clock or posedge reset)begin endalways (a or b or c)beginend10邊沿觸發的always塊常常描述時序行為,如有限狀態機。如果符合可綜合風格要求,則可通過綜合工具自動地將其轉換為表示寄存器組和門級組合邏輯的結構,而該結構應具有時序所要求的行為 電平觸發的always塊常常用來描述組合邏輯的行為。如果符合可
5、綜合風格要求,可通過綜合工具自動將其轉換為表示組合邏輯的門級邏輯結構或帶鎖存器的組合邏輯結構,而該結構應具有所要求的行為。一個模塊中可以有多個always塊,它們都是并行運行的。11always塊的or事件控制有時,多個信號或者事件中任意一個發生的變化都能觸發語句或語句塊的執行。在Verilog語言中,可以使用“或”表達式來表示這種情況。由關鍵詞“or”連接的多個事件名或信號名組成的列表稱為敏感列表。關鍵詞“or”被用來表示這種關系。Verilog 1364-2001版本的語法中,對于原來的規定作了補充:關鍵詞or也可以使用,來代替。使用,來代替關鍵詞or也適用于跳變沿敏感的觸發器。12/有異
6、步復位的電平敏感鎖存器always ( reset or clock or d ) /等待復位信號reset 或 時鐘信號clock 或 輸入信號d 的改變begin if ( reset ) /若 reset 信號為高,把q置零 q = 1 b0 ; else if ( clock ) /若clock 信號為高,鎖存輸入信號d q = d ;end13/有異步復位的電平敏感鎖存器always ( reset , clock , d )/等待復位信號reset 或 時鐘信號clock 或 輸入信號d的改變begin if ( reset ) / 若 reset 信號為高,把q置零 q = 1
7、b0 ; else if ( clock )/ 若clock 信號為高,鎖存輸入信號d q = d ;end14/用reset異步下降沿復位,clk正跳變沿觸發的D寄存器always ( posedge clk , negedge reset ) /注意:使用逗號來代替關鍵字or if (! reset ) q = 0 ; else q = d ;15如果組合邏輯塊語句的輸入變量很多,那么編寫敏感列表會很繁瑣并且容易出錯。針對這種情況,Verilog提供另外兩個特殊的符號:* 和(*),它們都表示對其后面語句塊中所有輸入變量的變化時敏感的。/用or 操作符的組合邏輯塊/編寫敏感列表很繁瑣并且容
8、易漏掉一個輸入always (a or b or c or d or e or f or g or h or p or m)begin out1 = a ? b + c : d + e ; out2 = f ? g + h : p + m ;end16/不用上述方法,用符號 (*) 來代替,/可以把所有輸入變量都自動包括進敏感列表。always ( * )begin out1 = a ? b + c : d + e ; out2 = f ? g + h : p + m ;end17電平敏感時序控制 waitalways wait (count_enable) #20 count=count+1
9、;仿真器連續監視count_enable的值,若其值為0,則不執行后面的語句,仿真會停頓下來;如果其值為1,則在20個時間單位之后執行這條語句。如果count_enable始終為1,那么count將每過20個時間單位加1。186.2 task和function說明語句在設計中,設計者經常需要在程序的多個不同地方實現同樣的功能。這表明有必要把這些公共的代碼提取出來,將其組成子程序,然后在需要的地方調用這些子程序,以避免重復編碼。Verilog語言提供的任務和函數可以將較大的設計劃分為較小的代碼段,允許設計者將在多個地方使用的相同代碼提取出來,編寫成任務和函數,以使代碼簡潔、易懂。19task和f
10、unction說明語句的不同點(1) 函數只能與主模塊共用同一個仿真時間單位,而任務可以定義自己的仿真時間單位。(2) 函數不能啟動任務,而任務能啟動其它任務和函數。(3) 函數至少要有一個輸入變量,而任務可以沒有或有多個任何類型的變量。(4) 函數返回一個值,而任務則不返回值。20task說明語句如果傳給任務的變量值和任務完成后接收結果的變量已定義,就可以用一條語句啟動任務。任務完成以后控制就傳回啟動過程。如任務內部有定時控制,則啟動的時間可以與控制返回的時間不同。任務可以啟動其它的任務,其它任務又可以啟動別的任務,可以啟動的任務數是沒有限制的。不管有多少任務啟動,只有當所有的啟動任務完成以
11、后,控制才能返回。21任務的定義定義任務的語法如下:task ; begin . endendtask22任務的調用及變量的傳遞啟動任務并傳遞輸入輸出變量的聲明語句的語法如下: (端口1,端口2,.,端口n);23module call_task; reg15:0 old_word; reg15:0 new_word; task switch_bytes; input15:0 old_w; output15:0 new_w; reg15:0 temp; /此變量可以不要,此處是為了說明task內變量的定義 begin temp=old_w; new_w15:8=temp7:0; new_w7:
12、0=temp15:8; end endtask24 initial begin old_word=16h3fa2; switch_bytes(old_word,new_word); #100; old_word=16habcd; switch_bytes(old_word,new_word); end endmodule 25module traffic_lights; reg clock, red, amber, green; parameter on=1, off=0, red_tics=350, amber_tics=30,green_tics=200; /交通燈初始化 initialr
13、ed=off; initialamber=off; initialgreen=off; /交通燈控制時序 always begin red=on;/開紅燈 light(red,red_tics); /調用等待任務 green=on;/開綠燈 light(green,green_tics);/等待 amber=on;/開黃燈 light(amber,amber_tics);/等待 end26 /定義交通燈開啟時間的任務 task light; output color; input31:0 tics; begin repeat(tics) (posedge clock);/等待tics個時鐘的上
14、升沿 color=off;/關燈 end endtask /產生時鐘脈沖的always塊 always begin #100 clock=0; #100 clock=1; endendmodule27function說明語句函數的目的是返回一個用于表達式的值。 定義函數的語法:function (函數名);begin.endendfunction28從函數返回的值函數的定義蘊含聲明了與函數同名的、函數內部的寄存器。如在函數的聲明語句中為缺省,則這個寄存器是一位的,否則是與函數定義中一致的寄存器。函數的定義把函數返回值所賦值寄存器的名稱初始化為與函數同名的內部變量。函數的調用函數的調用是通過將函
15、數作為表達式中的操作數來實現的。 (,)29函數的使用規則與任務相比較函數的使用有較多的約束,下面給出的是函數的使用規則: 函數的定義不能包含有任何的時間控制語句,即任何用、或wait來標識的語句。 函數不能啟動任務。 定義函數時至少要有一個輸入參量。 在函數的定義中必須有一條賦值語句給函數中的一個內部變量賦以函數的結果值,該內部變量具有和函數名相同的名字。30module call_function; reg15:0 old_word; reg15:0 new_word; function15:0 switch_bytes; input15:0 old_w; reg15:0 temp;/此變
16、量可以不要,此處是為了說明function內變量的定義 begin temp=old_w; switch_bytes15:8=temp7:0; switch_bytes7:0=temp15:8; end endfunction 31 initial begin old_word=16h3fa2; new_word=switch_bytes(old_word); #100; old_word=16habcd; new_word=switch_bytes(old_word); end endmodule 326.2.4函數使用舉例奇偶校驗位的計算/定義一個模塊,其中包含能計算偶校驗位的函數(cal
17、c_parity)module parity;reg 31:0 addr;reg parity;initialbeginaddr = 32h3456_789a;#10 addr = 32hc4c6_78ff;#10 addr = 32hff56_ff9a;#10 addr = 32h3faa_aaaa;end33/每當地址值發生變化,計算新的偶校驗位 always (addr)begin parity = calc_parity(addr); /第一次啟動校驗位計算函數 calc_parity $display(Parity calculated = %b, calc_parity(addr)
18、 ); / 第二次啟動校驗位計算函數 calc_parityend/定義偶校驗計算函數 function calc_parity;input 31:0 address;begin /適當地設置輸出值,使用隱含的內部寄存器calc_parity calc_parity = address; /返回所有地址位的異或值 endendfunctionendmodule34/定義偶校驗位計算函數,該函數采用ANSI C 風格的變量聲明function calc_parity (input 31:0 address);begin /適當地設置輸出值,使用隱含的內部寄存器calc_parity calc_p
19、arity = address; /返回所有地址位的異或值 endendfunction使用C C風格風格進行變量聲明的函數定義35/ 定義一個包含移位函數的模塊 module shifter;/ 左/右 移位寄存器 define LEFT_SHIFT 1b0define RIGHT_SHIFT 1b1reg 31:0 addr, left_addr, right_addr;/reg control; /每當新地址出現時就計算右移位和左移位的值 always (addr)begin/調用下面定義的具有左右移位功能的函數 left_addr = shift(addr, LEFT_SHIFT);
20、right_addr = shift(addr, RIGHT_SHIFT);end36/定義移位函數,其輸出是一個32位的值function 31:0 shift;input 31:0 address;input control;begin /根據控制信號適當地設置輸出值 shift = (control = LEFT_SHIFT) ? (address 1); endendfunctioninitialbegin addr=32h0001_0000; #100; addr=32h0200_0000;end endmodule376.2.5 自動(遞歸)函數Verilog中的函數是不能夠進行遞
21、歸調用的。若在函數聲明時使用關鍵字automatic,那么改函數可以遞歸調用。38/用函數的遞歸調用定義階乘計算module ex6_14 ;/定義自動(遞歸)函數function automatic integer factorial ;input 31:0 oper ;integer i ;beginif ( oper = 2 )/此處修改 factorial = factorial(oper-1)*oper; /遞歸調用else factorial = 1 ;endendfunction39/調用該函數integer result ;initial begin result = fact
22、orial ( 4 ) ; / 調用4的階乘 $display ( Factorial of 4 is %0d , result ) ; / 顯示24endendmodule 40module test_task; task automatic factorial;/*如果把automatic去掉,則仿真結果不正確*/ output integer result; input integer n; integer temp; begin if(n1) begin factorial(temp,n-1); result=temp*n; end else result=1; end endtask
23、41 integer num,res_out; always (num) begin factorial(res_out,num); $display(num=%d, result is %d,num,res_out); end initial begin num=5; #100; num=9; #50; num =3; end endmodule /* run 500 ns */426.2.6 常量函數常量函數實際上是一個帶有某些限制的常規Verilog函數。這種函數能夠用來引用復雜的值,因而可以用來代替常量。module ex6_15(addr_bus,out);parameter RAM
24、_DEPTH = 256 ;inputclogb2(RAM_DEPTH)-2:0 addr_bus ; /outputclogb2(RAM_DEPTH)-2:0 out; function integer clogb2(input integer depth) ;begin for (clogb2=0;depth0;clogb2=clogb2+1) depth = depth 1 ;endendfunction43 assign out=addr_bus; endmodule /force addr_bus 8hab 0 ,8h23 2006.2.7帶符號函數帶符號函數的返回值可以作為帶符號數
25、進行運算。44module ex6_16 ;reg3:0 vector;function signed3:0 compute_signed(input3:0 vector); compute_signed=vector;endfunctioninitialbegin vector=4b1001; if(compute_signed(vector)-3) $display(less.); else $display(more.); end endmodule456.4 常用的系統任務6.4.1 $display和$write任務格式$display(p1,p2,pn);$write(p1,p2,
26、pn);這兩個函數和系統任務的作用是用來輸出信息,即將參數p2到pn按參數p1給定的格式輸出。參數p1通常稱為“格式控制”,參數p2至pn通常稱為“輸出表列”。這兩個任務的作用基本相同。$display自動地在輸出后進行換行,$write則不是這樣。如果想在一行里輸出多個信息,可以使用$write。因為$write在輸出時不換行,要注意它的使用。可以在$write中加入換行符n,以確保明確的輸出顯示格式。46module disp;reg31:0 rval; initial begin rval=101; $display(rval=%h hex %d decimal, rval, rval)
27、; $display(rval=%o otal %b binary, rval, rval); $display(rval has %c ascii character value,rval); $display(current scope is %m); $display(%s is ascii value for 101,101); $display(simulation time is %t,$time); endendmodule47# rval=00000065 hex 101 decimal# rval=00000000145 otal 0000000000000000000000
28、0001100101 binary# rval has e ascii character value# current scope is disp# e is ascii value for 101# simulation time is 0486.4.2 文件輸出打開文件 使用系統任務$fopen用法:$fopen(“”);用法:=$fopen(“”); 任務$fopen返回一個被稱為多通道描述符的32位值。多通道描述符中只有一位被設置成1.標準輸出有一個多通道描述符,其最低位(第0位)被設置成1.標準的輸出也稱通道為0。標準輸出一直是開放的。以后對$fopen的每一次調用打開一個新通道,
29、并且返回一個設置第1位、第2位等,直到32位描述的第30位。第31位是保留位。通道號與多通道描述符中被設置成1的位相對應。多通道的優點在于可以有選擇的同時寫多個文件。49寫文件$fdisplay $fmonitor $fwrite $fstrobe都用于寫文件這些任務在語法上與常規系統任務$display、$monitor等類似關閉文件 使用系統任務$fclose$fclose();50module ex6_20;/多通道描述符 integer handle1, handle2, handle3; /整型數為 32 位/標準輸出是打開的; descriptor = 32h0000_0001 (
30、 第0位置1)integer desc1, desc2, desc3 ; / 三個文件的描述符initialbegin handle1 = $fopen(file1.out); /handle1 = 32h0000_0002 (bit 1 set 1) handle2 = $fopen(file2.out); /handle2 = 32h0000_0004 (bit 2 set 1) handle3 = $fopen(file3.out); /handle3 = 32h0000_0008 (bit 3 set 1)51 desc1 = handle1 | 1; /按位或; desc1 = 32
31、h0000_0003 $fdisplay(desc1, Display 1); /寫到文件file1.out和標準輸出stdout desc2 = handle2 | handle1; /desc2 = 32 h0000_0006 $fdisplay(desc2, Display 2); /寫到文件file1.out和file2.out desc3 = handle3 ; /desc3 = 32h0000_0008 $fdisplay(desc3, Display 3 desc1=%d desc2=%d desc3=%d,desc1,desc2,desc3); /只寫到文件file3.out
32、$fclose(handle1|handle2|handle3);/本句不寫也可以endendmodule526.4.3 顯示層次通過任何顯示任務,例如$display、$write、$monitor或者$strobe任務中的%m選項的方式可以顯示任何級別的層次。53/顯示層次信息 module M;initial $display(Displaying in %m);endmodule/調用模塊Mmodule top;M m1( );M m2( );M m3( );endmodule54仿真輸出如下所示:Displaying in top.m1Displaying in top.m2Disp
33、laying in top.m3這一特征可以顯示全層次路徑名,包括模塊實例、任務、函數和命名塊。556.4.4選通顯示$strobe 和$display任務除了一點小的差別外,其它非常相似。如果許多其它語句和$display任務在同一個時間單位執行,那么這些語句與$display任務的執行順序是不確定的。如果使用$strobe,該語句總是在同時刻的其他賦值語句執行完成后才執行。56module ex6_22;reg3:0 a,b,c,d;reg clock;always (posedge clock) $strobe(%t Displaying a = %b, c = %b,$time,a ,
34、c); /顯示正跳變沿時刻的值/選通顯示always (posedge clock)begin a = b ; c = d ;end57initial clock=0; always #10 clock=clock;initial begin b=4h0; d=4h2; #25; b=4h9; d=4h5;end endmodule /在例6.22中,時鐘上升沿的值在語句a = b和c = d執行完之后才顯示。/如果使用$display,$display可能在語句a = b和c = d之前執行,結果顯示不同的值。/run 4558值變轉儲文件值變轉儲文件(VCD)是一個ASCII文件,它包含仿真時間、范圍與信號的定義以及仿真運行過程中信號值的變化等信息。設計中的所有信號或者選定的信號集合在仿真過程中都可以被寫入VCD文件。后處理工具可以把VCD文件作為輸入并把層次信息、信號值和信號波形顯示出來。$dumpvars 用來選擇要轉儲的模塊實例或者模塊實例信號 $dumpfile選擇VCD文件$dumpon和$dumpoff 選擇轉儲過程的起點和終點$dumpall選擇生成檢測點。59/指定VCD文件名。若不指定VCD文件,則由仿真器指定一缺省文件名ini
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力設備在線監測系統的發展趨勢與挑戰考核試卷
- 2025年【起重機械電氣安裝維修】新版試題及答案
- 2024年項目管理考試回顧試題及答案
- 2025年注會學習技巧提升的途徑試題及答案
- 玻璃纖維增強塑料的低溫性能測試考核試卷
- 高端屋頂花園施工方案
- 汽車改裝配件批發考核試卷
- 2025年投資策略與經濟周期的互動關系試題及答案
- 社區服務與社會組織發展考核試卷
- 機場航站樓服務質量評價指標體系考核試卷
- 中醫醫術確有專長人員(多年實踐人員)醫師資格考核申請表
- 宏觀大類外匯系列專題(一)阿根廷匯率貶值的經驗教訓
- 教學課件 金屬學與熱處理-崔忠圻
- 成礦預測課件
- GB∕T 2518-2019 連續熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 年產美甲貼100萬張新建項目環境影響報告表
- 信息時代的研究生 學習與創新能力培養
- 契稅補貼申請表
- 西山煤電集團白家莊礦煤層開采初步設計
- 高速公路內業資料規范化管理實施細則課件
- 最新金屬軟管設計制造新工藝新技術及性能測試實用手冊
評論
0/150
提交評論