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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Verilog的任務及函數區別和聯系 區別 任務(任務(task)task)通常用于調試,或對硬件通常用于調試,或對硬件進行行為描述進行行為描述可以包含時序控制(可以包含時序控制(# #延延遲,遲,, wait, wait)可以有可以有 inputinput,outputoutput,和和inoutinout參數參數可以調用其他任務或函數可以調用其他任務或函數 函數函數(function)(function)通常用于計算,或描述組通常用于計算,或描述組合邏輯合邏輯不能包含任何延遲;函數不能包含任何延遲;函數仿真時間為仿真時間為0 0只含有只含有inputinput參數并由函參數并由函數名返回一

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

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

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

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

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

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

8、4;read_mem(a,b); /第二次調用end endmodule在上面的模塊中,任務“read_mem”得到了兩次調用,由于這個任務在定義時說明了輸入端口和輸出端口,所以任務調用語句內必須包含端口名列表“(a,b)”,其中變量a與任務的輸入端口“address”相對應,變量b與任務的輸出端口“data”相對應,并且這兩個變量在寬度上也是與對應的端口相一致的。這樣,在任務被調用執行時,變量a的值通過輸入端口傳給了address;在任務調用完成后,輸出信號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); /調用等待任務 green=on; /開綠燈 light( green, green_tics); /等待 amber=on; /開黃燈 light( amber, amber_tics);/等待end交通燈開啟時間

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

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

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

13、 (a, b, c, d, e);函數定義function 7:0 getbyte ; /函數定義結構的開頭,注意此行中不能出現端口名列表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;/第二條行為語句:將結果賦值給函數名變量getbytee

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

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

16、部分是作為“賦值表達式”出現在整條過程賦值語句中的,函數調用部分不能單獨地作為一條語句出現,這就是說語句“getbyte(input1,number);”是非法的。(2) 函數調用既能出現在過程塊中,也能出現在assign連續賦值語句中。比如語句:wire7:0 net1;reg 63:0 input1;assign net1= getbyte( input1,3 );中的函數調用就出現在一條連續賦值語句內,這條語句指定由函數調用返回值對8位連線型變量net1進行連續驅動。函數的調用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); /第一次調用$display(after the first call,the returned value is : %b,call_output );#100;$display(“second call,return value: %b ”,getbyte(input1,6) ); /第二次調用endendmodule上例模塊中的initial過程塊對函數“getbyte”進行了兩次調用:

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

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

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

溫馨提示

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

評論

0/150

提交評論