verilog 任務(wù)和函數(shù)_第1頁
verilog 任務(wù)和函數(shù)_第2頁
verilog 任務(wù)和函數(shù)_第3頁
verilog 任務(wù)和函數(shù)_第4頁
verilog 任務(wù)和函數(shù)_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Verilog的任務(wù)及函數(shù)區(qū)別和聯(lián)系 區(qū)別 任務(wù)(任務(wù)(task)task)通常用于調(diào)試,或?qū)τ布ǔS糜谡{(diào)試,或?qū)τ布M行行為描述進行行為描述可以包含時序控制(可以包含時序控制(# #延延遲,遲,, wait, wait)可以有可以有 inputinput,outputoutput,和和inoutinout參數(shù)參數(shù)可以調(diào)用其他任務(wù)或函數(shù)可以調(diào)用其他任務(wù)或函數(shù) 函數(shù)函數(shù)(function)(function)通常用于計算,或描述組通常用于計算,或描述組合邏輯合邏輯不能包含任何延遲;函數(shù)不能包含任何延遲;函數(shù)仿真時間為仿真時間為0 0只含有只含有inputinput參數(shù)并由函參數(shù)并由函數(shù)名返回一

2、個結(jié)果數(shù)名返回一個結(jié)果可以調(diào)用其他函數(shù),但不可以調(diào)用其他函數(shù),但不能調(diào)用任務(wù)能調(diào)用任務(wù)共同點任務(wù)和函數(shù)必須在任務(wù)和函數(shù)必須在modulemodule內(nèi)調(diào)用內(nèi)調(diào)用在任務(wù)和函數(shù)中不能聲明在任務(wù)和函數(shù)中不能聲明wirewire所有輸入所有輸入/ /輸出都是輸出都是局部寄存器局部寄存器任務(wù)任務(wù)/ /函數(shù)執(zhí)行完成后才返回結(jié)果函數(shù)執(zhí)行完成后才返回結(jié)果。例如,若任務(wù)例如,若任務(wù)/ /函數(shù)中有函數(shù)中有foreverforever語句,則永遠不會返語句,則永遠不會返回結(jié)果回結(jié)果任務(wù)(task)”類似于其它編程語言中的“過程”。任務(wù)的使用包括任務(wù)定義和任務(wù)調(diào)用。任務(wù)既可表示組合邏輯又可表達時序邏輯,定義的形式如下

3、task ;begin . endendtask任務(wù)可以沒有或有一個或多個參數(shù)。值通過參數(shù)傳入和傳出任務(wù)。除輸入?yún)?shù)外(參數(shù)從任務(wù)中接收值),任務(wù)還能帶有輸出參數(shù)(從任務(wù)中返回值)和輸入輸出參數(shù)。任務(wù)的定義在模塊說明部分中編寫。 “局部變量說明”用來對任務(wù)內(nèi)用到的局部變量進行寬度和類型說明,這個說明語句的語法與進行模塊定義時的相應說明語句語法是一致的。由“begin”和“end”關(guān)鍵詞界定的一組行為語句指明了任務(wù)被調(diào)用時需要進行的操作。在任務(wù)被調(diào)用時,這些行為語句將按串行方式得到執(zhí)行。任務(wù)定義與“過程塊”、“連續(xù)賦值語句”及“函數(shù)定義”這三種成份以并列方式存在于行為描述模塊中,它們在層次級別上

4、是相同的。任務(wù)定義結(jié)構(gòu)不能出現(xiàn)在任何一個過程塊的內(nèi)部。任務(wù)的定義。task read_mem;/任務(wù)定義結(jié)構(gòu)的開頭,指定任務(wù)名為“read_mem” input 15:0 address;/輸入端口說明output 31:0 data;/輸出端口說明reg 3:0 counter;/局部變量說明reg7:0 temp 1:4;/局部變量說明begin/語句塊 ,指明任務(wù)被調(diào)用時需要進行的操作for (counter=1 ;counter=4;counter=counter+1)tempcounter=memaddress+counter-1;data=temp1,temp2,temp3,tem

5、p4;endendtask /任務(wù)定義結(jié)構(gòu)的結(jié)尾上例定義了一個名為“read_mem”的任務(wù),該任務(wù)有一個16位的輸入端口“address”、一個32位的輸出端口“data”、一個4位的局部變量“counter”和一個8位的存儲器“temp”。當上例所定義的任務(wù)被調(diào)用時,begin和end中間的語句得到執(zhí)行,它們用來執(zhí)行對存儲器“mem”進行的四次讀操作,將其結(jié)果合并后輸出到端口“data”。在定義任務(wù)時必須注意如下幾點: (1) 在第一行“task”語句中不能列出端口名列表。 (2) 在任務(wù)定義結(jié)構(gòu)中的“行為語句”部分可以有延時語句、敏感事件控制語句等時間控制語句出現(xiàn)。 (3) 一個任務(wù)可以

6、沒有輸入、輸出和雙向端口,也可以有一個或多個輸入、輸出和雙向端口。 (4) 一個任務(wù)可以沒有返回值,也可以通過輸出端口或雙向端口返回一個或多個返回值。 (5) 在一個任務(wù)中可以調(diào)用其它的任務(wù)或函數(shù),也可以調(diào)用該任務(wù)本身。 (6) 在任務(wù)定義結(jié)構(gòu)內(nèi)不允許出現(xiàn)過程塊(initial 或always過程塊)。 (7) 在任務(wù)定義結(jié)構(gòu)內(nèi)可以出現(xiàn)“disable中止語句”,這條語句的執(zhí)行將中斷正在執(zhí)行的任務(wù)。當任務(wù)被中斷后,程序流程將返回到調(diào)用任務(wù)的地方繼續(xù)向下執(zhí)行。任務(wù)的調(diào)用任務(wù)的調(diào)用任務(wù)的調(diào)用是通過“任務(wù)調(diào)用語句”來實現(xiàn)的。任務(wù)調(diào)用語句的語法如下: ( 端口1,端口2,端口n );其中,“(端口1,

7、 端口2, 端口n)”組成了一個端口名列表。在調(diào)用任務(wù)時必須注意:(1) 任務(wù)調(diào)用語句只能出現(xiàn)在過程塊內(nèi)。(2) 任務(wù)調(diào)用語句就像一條普通的行為語句那樣得到處理。(3) 當被調(diào)用的任務(wù)具有輸入或輸出端口時,任務(wù)調(diào)用語句必須包含端口名列表,這個列表內(nèi)各個端口名出現(xiàn)的順序和類型必須與任務(wù)定義結(jié)構(gòu)中端口說明部分的端口順序和類型相一致,注意只有寄存器類的變量才能與任務(wù)的輸出端口相對應。對任務(wù)進行調(diào)用module demo_task_invo;reg7:0 mem 128:0;reg15:0 a;reg31:0 b;initialbegina=0;read_mem(a,b); /第一次調(diào)用#10;a=6

8、4;read_mem(a,b); /第二次調(diào)用end endmodule在上面的模塊中,任務(wù)“read_mem”得到了兩次調(diào)用,由于這個任務(wù)在定義時說明了輸入端口和輸出端口,所以任務(wù)調(diào)用語句內(nèi)必須包含端口名列表“(a,b)”,其中變量a與任務(wù)的輸入端口“address”相對應,變量b與任務(wù)的輸出端口“data”相對應,并且這兩個變量在寬度上也是與對應的端口相一致的。這樣,在任務(wù)被調(diào)用執(zhí)行時,變量a的值通過輸入端口傳給了address;在任務(wù)調(diào)用完成后,輸出信號data又通過對應的端口傳給了變量b。交通燈控制模塊module traffic_lights;reg clock, red, ambe

9、r, green;parameter on=1, off=0, red_tics=350,amber_tics=30,green_tics=200; /交通燈初始化 initialred=off; initialamber=off; initialgreen=off; /交通燈控制時序always begin red=on; /開紅燈 light( red, red_tics); /調(diào)用等待任務(wù) green=on; /開綠燈 light( green, green_tics); /等待 amber=on; /開黃燈 light( amber, amber_tics);/等待end交通燈開啟時間

10、的任務(wù)task light;output color;input31:0 tics; begin repeat(tics) (posedge clock);/等待tics個時鐘的上升沿 color=off;/關(guān)燈 end endtask/產(chǎn)生時鐘脈沖的always塊always begin #100 clock=0; #100 clock=1; endendmoduletask總結(jié) 1.任務(wù)的定義與引用都在一個module模塊內(nèi)部 2.任務(wù)的定義與module的定義有些類似,同樣 需要進行端口說明與數(shù)據(jù)類型說明。另外,任 務(wù)定義的內(nèi)部沒有過程塊,但在塊語句中可以 包含定時控制部分。 3.當任務(wù)

11、被引用時,任務(wù)被激活。 4.一個任務(wù)可以調(diào)用別的任務(wù)或函數(shù)。function 函數(shù)(function)類似于其它編程語言中的函數(shù)概念。與任務(wù)一樣,Verilog HDL語言中的函數(shù)使用包括了函數(shù)的定義和函數(shù)的調(diào)用。1. 函數(shù)的定義函數(shù)定義的語法如下:function ;beginendendfunction返回值類型可以有三種形式:(1) “msb:lsb”:這種形式說明函數(shù)名所代表的返回數(shù)據(jù)變量是一個多位的寄存器變量,它的位數(shù)由msb:lsb指定,比如如下函數(shù)定義語句:function 7:0 adder; 就定義了一個函數(shù)“adder”,它的函數(shù)名“adder”還代表著一個8位寬的寄存器變

12、量,其最高位為第7位,最低位為第0位。(2) “integer”:這種形式說明函數(shù)名代表的返回變量是一個整數(shù)型變量。(3) “real”:這種形式說明函數(shù)名代表的返回變量是一個實數(shù)型變量。函數(shù)的主要特性:函數(shù)定義中不能包含任何時序控制語句。函數(shù)至少有一個輸入,不能包含任何輸出或雙向端口。函數(shù)只返回一個數(shù)據(jù),其缺省為reg類型。傳送到函數(shù)的參數(shù)順序和函數(shù)輸入?yún)?shù)的說明順序相同。函數(shù)在模塊(module)內(nèi)部定義。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。雖然函數(shù)只返回單個值,但返回的值可以直接給信號連接賦值。這在需要有多個輸出時非常有效。 如: o1, o2, o3, o4 = f_ or_ and

13、 (a, b, c, d, e);函數(shù)定義function 7:0 getbyte ; /函數(shù)定義結(jié)構(gòu)的開頭,注意此行中不能出現(xiàn)端口名列表input 63:0 word; /說明第一個輸入端口(輸入端口1)input 3:0 bytenum; /說明第二個輸入端口(輸入端口2)integer bit; /局部變量說明reg 7:0 temp; /局部變量說明begin for (bit=0; bit=7; bit=bit+1)tempbit=word (bytenum-1)*8)+bit ; /第一條行為語句getbyte = temp;/第二條行為語句:將結(jié)果賦值給函數(shù)名變量getbytee

14、nd endfunction / 函數(shù)定義結(jié)束函數(shù)定義時必須注意:(1) 與任務(wù)一樣,函數(shù)定義結(jié)構(gòu)只能出現(xiàn)在模塊中,而不能出現(xiàn)在過程塊內(nèi)。(2) 函數(shù)至少必須有一個輸入端口。(3) 函數(shù)不能有任何類型的輸出端口(output端口)和雙向端口 (inout端口)。 (4) 在函數(shù)定義結(jié)構(gòu)中的行為語句部分內(nèi)不能出現(xiàn)任何類型的時間控制描述,也不允許使用disable終止語句。(5) 與任務(wù)定義一樣,函數(shù)定義結(jié)構(gòu)內(nèi)部不能出現(xiàn)過程塊。(6) 在一個函數(shù)內(nèi)可以對其它函數(shù)進行調(diào)用,但是函數(shù)不能調(diào)用其它任務(wù)。(7) 在第一行“function”語句中不能出現(xiàn)端口名列表。函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)調(diào)用的格式如下:

15、 (, );其中,m個“”與函數(shù)定義結(jié)構(gòu)中說明的各個輸入端口一一對應,它們代表著各個輸入端口的輸入數(shù)據(jù)。這些輸入表達式的排列順序及類型必須與各個輸入端口在函數(shù)定義結(jié)構(gòu)中的排列順序及類型保持嚴格一致。在調(diào)用函數(shù)時必須注意如下兩點:(1) 函數(shù)的調(diào)用不能單獨作為一條語句出現(xiàn),它只能作為一個操作數(shù)出現(xiàn)在調(diào)用語句內(nèi)。例如,下面這條語句對前面所定義的函數(shù)“getbyte”進行了調(diào)用:out = getbyte( input1,number);在這條調(diào)用語句中,函數(shù)調(diào)用部分“getbyte( input1,number)”被看作是一個操作數(shù),這個操作數(shù)的取值就是函數(shù)調(diào)用的返回值。在整個調(diào)用語句中,函數(shù)調(diào)用

16、部分是作為“賦值表達式”出現(xiàn)在整條過程賦值語句中的,函數(shù)調(diào)用部分不能單獨地作為一條語句出現(xiàn),這就是說語句“getbyte(input1,number);”是非法的。(2) 函數(shù)調(diào)用既能出現(xiàn)在過程塊中,也能出現(xiàn)在assign連續(xù)賦值語句中。比如語句:wire7:0 net1;reg 63:0 input1;assign net1= getbyte( input1,3 );中的函數(shù)調(diào)用就出現(xiàn)在一條連續(xù)賦值語句內(nèi),這條語句指定由函數(shù)調(diào)用返回值對8位連線型變量net1進行連續(xù)驅(qū)動。函數(shù)的調(diào)用module demo_function_call;reg7:0 call_output;reg63:0 inp

17、ut1;reg3:0 input2;initialbegininput1=64h123456789abcdef0;input2=3;call_output=getbyte(input1,input2); /第一次調(diào)用$display(after the first call,the returned value is : %b,call_output );#100;$display(“second call,return value: %b ”,getbyte(input1,6) ); /第二次調(diào)用endendmodule上例模塊中的initial過程塊對函數(shù)“getbyte”進行了兩次調(diào)用:

18、函數(shù)getbyte的第一次調(diào)用是作為過程賦值語句“call_output=getbyte(input1,input2);”右端的賦值表達式出現(xiàn)的,調(diào)用時的輸入表達式分別為兩個寄存器變量input1和input2,它們將與函數(shù)定義結(jié)構(gòu)中的第一個和第二個輸入端口相對應,因此這兩個寄存器變量的取值將分別被傳遞給函數(shù)輸入端口“word”和“bytenum”。函數(shù)調(diào)用完成后,過程賦值語句中的“getbyte”將具有函數(shù)調(diào)用的返回值,這個返回值將作為“賦值表達式”參與對變量call_output進行的過程賦值操作。階乘運算函數(shù)module funct(clk, n, result, reset);outp

19、ut31:0 result;input3:0 n;input reset, clk;reg31:0 result;always (posedge clk) /在clk 的上升沿時執(zhí)行運算begin if(!reset) result=0; /復位 else result = 2 * factorial(n); /調(diào)用factorial 函數(shù) endfunction31:0 factorial; /階乘運算函數(shù)定義(注意無端口列表)input3:0 opa; /函數(shù)只能定義輸入端,輸出端口為函數(shù)名本身reg3:0 i;beginfactorial = 1;for(i= 2; i = opa; i

20、 = i+1) /該句若要綜合通過,opa 應賦具體的數(shù)值factorial = i* factorial; /階乘運算endendfunctionendmodule對于子程序,如果滿足下述所有條件則可以用函數(shù)來完成: 1.在子程序中不含有延遲時序或者控制結(jié)構(gòu) 2.子程序只有一個返回值 3.至少有一個輸入變量 4.沒有輸出或者雙向變量 5.不含有非阻塞賦值語句函數(shù)歸納1. 函數(shù)定義不能包含任何定時控制語句。即任何用、或wait來標識的語句 2. 函數(shù)必須至少有一個輸入,但絕不能含有任何輸出和總線口;3. 一個函數(shù)只能返回一個值,該值的變量名與函數(shù)同名,數(shù)據(jù)類型默認為reg類型。4. 傳遞給函數(shù)的變量順序與函數(shù)輸入口聲明的順序相同。5. 函數(shù)定義必須包含在模塊定義之內(nèi)。6. 函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。7. 函數(shù)使Verilog有更廣闊的適用范圍。問題函數(shù)與任務(wù)的共同點:1.任務(wù)和函數(shù)必須在模塊內(nèi)定義,其作用范圍僅適用于該模塊,可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論