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

下載本文檔

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

文檔簡(jiǎn)介

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

2、個(gè)結(jié)果數(shù)名返回一個(gè)結(jié)果可以調(diào)用其他函數(shù),但不可以調(diào)用其他函數(shù),但不能調(diào)用任務(wù)能調(diào)用任務(wù)共同點(diǎn)任務(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語(yǔ)句,則永遠(yuǎn)不會(huì)返語(yǔ)句,則永遠(yuǎn)不會(huì)返回結(jié)果回結(jié)果任務(wù)(task)”類似于其它編程語(yǔ)言中的“過(guò)程”。任務(wù)的使用包括任務(wù)定義和任務(wù)調(diào)用。任務(wù)既可表示組合邏輯又可表達(dá)時(shí)序邏輯,定義的形式如下

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

4、是相同的。任務(wù)定義結(jié)構(gòu)不能出現(xiàn)在任何一個(gè)過(guò)程塊的內(nèi)部。任務(wù)的定義。task read_mem;/任務(wù)定義結(jié)構(gòu)的開頭,指定任務(wù)名為“read_mem” input 15:0 address;/輸入端口說(shuō)明output 31:0 data;/輸出端口說(shuō)明reg 3:0 counter;/局部變量說(shuō)明reg7:0 temp 1:4;/局部變量說(shuō)明begin/語(yǔ)句塊 ,指明任務(wù)被調(diào)用時(shí)需要進(jìn)行的操作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é)尾上例定義了一個(gè)名為“read_mem”的任務(wù),該任務(wù)有一個(gè)16位的輸入端口“address”、一個(gè)32位的輸出端口“data”、一個(gè)4位的局部變量“counter”和一個(gè)8位的存儲(chǔ)器“temp”。當(dāng)上例所定義的任務(wù)被調(diào)用時(shí),begin和end中間的語(yǔ)句得到執(zhí)行,它們用來(lái)執(zhí)行對(duì)存儲(chǔ)器“mem”進(jìn)行的四次讀操作,將其結(jié)果合并后輸出到端口“data”。在定義任務(wù)時(shí)必須注意如下幾點(diǎn): (1) 在第一行“task”語(yǔ)句中不能列出端口名列表。 (2) 在任務(wù)定義結(jié)構(gòu)中的“行為語(yǔ)句”部分可以有延時(shí)語(yǔ)句、敏感事件控制語(yǔ)句等時(shí)間控制語(yǔ)句出現(xiàn)。 (3) 一個(gè)任務(wù)可以

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

7、 端口2, 端口n)”組成了一個(gè)端口名列表。在調(diào)用任務(wù)時(shí)必須注意:(1) 任務(wù)調(diào)用語(yǔ)句只能出現(xiàn)在過(guò)程塊內(nèi)。(2) 任務(wù)調(diào)用語(yǔ)句就像一條普通的行為語(yǔ)句那樣得到處理。(3) 當(dāng)被調(diào)用的任務(wù)具有輸入或輸出端口時(shí),任務(wù)調(diào)用語(yǔ)句必須包含端口名列表,這個(gè)列表內(nèi)各個(gè)端口名出現(xiàn)的順序和類型必須與任務(wù)定義結(jié)構(gòu)中端口說(shuō)明部分的端口順序和類型相一致,注意只有寄存器類的變量才能與任務(wù)的輸出端口相對(duì)應(yīng)。對(duì)任務(wù)進(jìn)行調(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)用,由于這個(gè)任務(wù)在定義時(shí)說(shuō)明了輸入端口和輸出端口,所以任務(wù)調(diào)用語(yǔ)句內(nèi)必須包含端口名列表“(a,b)”,其中變量a與任務(wù)的輸入端口“address”相對(duì)應(yīng),變量b與任務(wù)的輸出端口“data”相對(duì)應(yīng),并且這兩個(gè)變量在寬度上也是與對(duì)應(yīng)的端口相一致的。這樣,在任務(wù)被調(diào)用執(zhí)行時(shí),變量a的值通過(guò)輸入端口傳給了address;在任務(wù)調(diào)用完成后,輸出信號(hào)data又通過(guò)對(duì)應(yīng)的端口傳給了變量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; /交通燈控制時(shí)序always begin red=on; /開紅燈 light( red, red_tics); /調(diào)用等待任務(wù) green=on; /開綠燈 light( green, green_tics); /等待 amber=on; /開黃燈 light( amber, amber_tics);/等待end交通燈開啟時(shí)間

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

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

12、量,其最高位為第7位,最低位為第0位。(2) “integer”:這種形式說(shuō)明函數(shù)名代表的返回變量是一個(gè)整數(shù)型變量。(3) “real”:這種形式說(shuō)明函數(shù)名代表的返回變量是一個(gè)實(shí)數(shù)型變量。函數(shù)的主要特性:函數(shù)定義中不能包含任何時(shí)序控制語(yǔ)句。函數(shù)至少有一個(gè)輸入,不能包含任何輸出或雙向端口。函數(shù)只返回一個(gè)數(shù)據(jù),其缺省為reg類型。傳送到函數(shù)的參數(shù)順序和函數(shù)輸入?yún)?shù)的說(shuō)明順序相同。函數(shù)在模塊(module)內(nèi)部定義。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。雖然函數(shù)只返回單個(gè)值,但返回的值可以直接給信號(hào)連接賦值。這在需要有多個(gè)輸出時(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; /說(shuō)明第一個(gè)輸入端口(輸入端口1)input 3:0 bytenum; /說(shuō)明第二個(gè)輸入端口(輸入端口2)integer bit; /局部變量說(shuō)明reg 7:0 temp; /局部變量說(shuō)明begin for (bit=0; bit=7; bit=bit+1)tempbit=word (bytenum-1)*8)+bit ; /第一條行為語(yǔ)句getbyte = temp;/第二條行為語(yǔ)句:將結(jié)果賦值給函數(shù)名變量getbytee

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

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

16、部分是作為“賦值表達(dá)式”出現(xiàn)在整條過(guò)程賦值語(yǔ)句中的,函數(shù)調(diào)用部分不能單獨(dú)地作為一條語(yǔ)句出現(xiàn),這就是說(shuō)語(yǔ)句“getbyte(input1,number);”是非法的。(2) 函數(shù)調(diào)用既能出現(xiàn)在過(guò)程塊中,也能出現(xiàn)在assign連續(xù)賦值語(yǔ)句中。比如語(yǔ)句:wire7:0 net1;reg 63:0 input1;assign net1= getbyte( input1,3 );中的函數(shù)調(diào)用就出現(xiàn)在一條連續(xù)賦值語(yǔ)句內(nèi),這條語(yǔ)句指定由函數(shù)調(diào)用返回值對(duì)8位連線型變量net1進(jìn)行連續(xù)驅(qū)動(dòng)。函數(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過(guò)程塊對(duì)函數(shù)“getbyte”進(jìn)行了兩次調(diào)用:

18、函數(shù)getbyte的第一次調(diào)用是作為過(guò)程賦值語(yǔ)句“call_output=getbyte(input1,input2);”右端的賦值表達(dá)式出現(xiàn)的,調(diào)用時(shí)的輸入表達(dá)式分別為兩個(gè)寄存器變量input1和input2,它們將與函數(shù)定義結(jié)構(gòu)中的第一個(gè)和第二個(gè)輸入端口相對(duì)應(yīng),因此這兩個(gè)寄存器變量的取值將分別被傳遞給函數(shù)輸入端口“word”和“bytenum”。函數(shù)調(diào)用完成后,過(guò)程賦值語(yǔ)句中的“getbyte”將具有函數(shù)調(diào)用的返回值,這個(gè)返回值將作為“賦值表達(dá)式”參與對(duì)變量call_output進(jìn)行的過(guò)程賦值操作。階乘運(yùn)算函數(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 的上升沿時(shí)執(zhí)行運(yùn)算begin if(!reset) result=0; /復(fù)位 else result = 2 * factorial(n); /調(diào)用factorial 函數(shù) endfunction31:0 factorial; /階乘運(yùn)算函數(shù)定義(注意無(wú)端口列表)input3:0 opa; /函數(shù)只能定義輸入端,輸出端口為函數(shù)名本身reg3:0 i;beginfactorial = 1;for(i= 2; i = opa; i

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論