任務(wù)就是一段封裝在“task-endtask”之間的程序。 任務(wù)是通過(guò)調(diào)用來(lái)執(zhí)行的,而且只有在調(diào)用時(shí)才執(zhí)行,如果定義了任務(wù),但是在整個(gè)過(guò)程中都沒(méi)有調(diào)用它,那么這個(gè)任務(wù)是不會(huì)執(zhí)行的。 調(diào)用某個(gè)任務(wù)時(shí)可能需要它處理某些數(shù)據(jù)并返回操作結(jié)果,所以任務(wù)應(yīng)當(dāng)有接收數(shù)據(jù)的輸入端和返回?cái)?shù)據(jù)的輸出端。 另外,任務(wù)可以彼此調(diào)用,而且任務(wù)內(nèi)還可以調(diào)用函數(shù)。
1.任務(wù)定義
任務(wù)定義的形式如下:
task task_id; 
[declaration] 
procedural_statement 
endtask
其中,關(guān)鍵詞 task 和 endtask 將它們之間的內(nèi)容標(biāo)志成一個(gè)任務(wù)定義, task 標(biāo)志著一個(gè)任務(wù)定義結(jié)構(gòu)的開(kāi)始; task_id 是任務(wù)名; 可選項(xiàng) declaration 是端口聲明語(yǔ)句和變量聲明語(yǔ)句,任務(wù)接收輸入值和返回輸出值就是通過(guò)此處聲明的端口進(jìn)行的;
procedural_statement是一段用來(lái)完成這個(gè)任務(wù)操作的過(guò)程語(yǔ)句,如果過(guò)程語(yǔ)句多于一條,應(yīng)將其放在語(yǔ)句塊內(nèi); endtask 為任務(wù)定義結(jié)構(gòu)體結(jié)束標(biāo)志。 下面給出一個(gè)任務(wù)定義的實(shí)例。
:定義一個(gè)任務(wù)。 
task task_demo;                //任務(wù)定義結(jié)構(gòu)開(kāi)頭,命名為 task_demo 
input  [7:0] x,y;           //輸入端口說(shuō)明 
output [7:0] tmp;           //輸出端口說(shuō)明 
if(x>y)                  //給出任務(wù)定義的描述語(yǔ)句 
tmp = x; 
else 
tmp = y;
endtask 
上述代碼
定義了一個(gè)名為“task_demo”的任務(wù),求取兩個(gè)數(shù)的最大值。 在定義任務(wù)時(shí),有下列六點(diǎn)需要注意:
(1)在第一行“task”語(yǔ)句中不能列出端口名稱(chēng);
(2)任務(wù)的輸入、輸出端口和雙向端口數(shù)量不受限制,甚至可以沒(méi)有輸入、輸出以及雙向端口。
(3)在任務(wù)定義的描述語(yǔ)句中,可以使用出現(xiàn)不可綜合操作符合語(yǔ)句(使用最為頻繁的就是延遲控制語(yǔ)句) ,但這樣會(huì)造成該任務(wù)不可綜合。
(4)在任務(wù)中可以調(diào)用其他的任務(wù)或函數(shù),也可以調(diào)用自身。
(5)在任務(wù)定義結(jié)構(gòu)內(nèi)不能出現(xiàn) initial和 always過(guò)程塊。
(6)在任務(wù)定義中可以出現(xiàn)“disable 中止語(yǔ)句” ,將中斷正在執(zhí)行的任務(wù),但其是不可綜合的。 當(dāng)任務(wù)被中斷后,程序流程將返回到調(diào)用任務(wù)的地方繼續(xù)向下執(zhí)行。
2.任務(wù)調(diào)用
雖然任務(wù)中不能出現(xiàn) initial 語(yǔ)句和 always 語(yǔ)句語(yǔ)句, 但任務(wù)調(diào)用語(yǔ)句可以在 initial 語(yǔ)句和 always 語(yǔ)句中使用,其語(yǔ)法形式如下:task_id[(端口1, 端口 2, ........, 端口 N)];
其中 task_id是要調(diào)用的任務(wù)名,端口 1、端口 2,… 是參數(shù)列表。 參數(shù)列表給出傳入任務(wù)的數(shù)據(jù)(進(jìn)入任務(wù)的輸入端)和接收返回結(jié)果的變量(從任務(wù)的輸出端接收返回結(jié)果) 。 任務(wù)調(diào)用語(yǔ)句中,參數(shù)列表的順序必須與任務(wù)定義中的端口聲明順序相同。 任務(wù)調(diào)用語(yǔ)句是過(guò)程性語(yǔ)句,所以任務(wù)調(diào)用中接收返回?cái)?shù)據(jù)的變量必須是寄存器類(lèi)型。 下面給出一個(gè)任務(wù)調(diào)用實(shí)例。
例:通過(guò) Verilog HDL 的任務(wù)調(diào)用實(shí)現(xiàn)一個(gè) 4 bit全加器。
module EXAMPLE (A, B, CIN, S, COUT); 
input [3:0] A, B; 
input CIN; 
output [3:0] S; 
output COUT; 
reg [3:0] S; 
reg COUT; 
reg [1:0] S0, S1, S2, S3; 
task ADD; 
input A, B, CIN; 
output [1:0] C; 
reg [1:0] C; 
reg S, COUT; 
begin
S = A ^ B ^ CIN; 
COUT = (A&B) | (A&CIN) | (B&CIN); 
C = {COUT, S}; 
end 
endtask 
always @(A or B or CIN) begin 
ADD (A[0], B[0], CIN, S0); 
ADD (A[1], B[1], S0[1], S1); 
ADD (A[2], B[2], S1[1], S2); 
ADD (A[3], B[3], S2[1], S3); 
S = {S3[0], S2[0], S1[0], S0[0]}; 
COUT = S3[1]; 
end 
endmodule
在調(diào)用任務(wù)時(shí),需要注意以下幾點(diǎn):
(1)任務(wù)調(diào)用語(yǔ)句只能出現(xiàn)在過(guò)程塊內(nèi);
(2)任務(wù)調(diào)用語(yǔ)句和一條普通的行為描述語(yǔ)句的處理方法一致;
(3)當(dāng)被調(diào)用輸入、輸出或雙向端口時(shí),任務(wù)調(diào)用語(yǔ)句必須包含端口名列表,且信號(hào)端口順序和類(lèi)型必須和任務(wù)定義結(jié)構(gòu)中的順序和類(lèi)型一致。 需要說(shuō)明的是,任務(wù)的輸出端口必須和寄存器類(lèi)型的數(shù)據(jù)變量對(duì)應(yīng)。
(4)可綜合任務(wù)只能實(shí)現(xiàn)組合邏輯,也就是說(shuō)調(diào)用可綜合任務(wù)的時(shí)間為“0” 。 而在面向仿真的任務(wù)中可以帶有時(shí)序控制,如時(shí)延,因此面向仿真的任務(wù)的調(diào)用時(shí)間不為“0” 。
- 
                                Verilog
                                +關(guān)注
關(guān)注
30文章
1369瀏覽量
113899 - 
                                端口
                                +關(guān)注
關(guān)注
4文章
1092瀏覽量
33692 - 
                                程序
                                +關(guān)注
關(guān)注
117文章
3833瀏覽量
84602 - 
                                調(diào)用函數(shù)
                                +關(guān)注
關(guān)注
0文章
11瀏覽量
2450 
發(fā)布評(píng)論請(qǐng)先 登錄
verilog中關(guān)于task的調(diào)用問(wèn)題
轉(zhuǎn)載---verilog中task和function的區(qū)別
Verilog中#號(hào)的用法請(qǐng)教
verilog中generate語(yǔ)句的用法分享
簡(jiǎn)談FPGA verilog中的task用法
簡(jiǎn)談FPGA verilog中的function用法與例子
    
如何進(jìn)行Android中Task任務(wù)棧的分配
    
verilog中的task用法介紹
verilog中function和task的區(qū)別
verilog function函數(shù)的用法
verilog task和function區(qū)別
verilog inout用法與仿真
Verilog中signed和$signed()的用法
    
          
        
        
verilog中的task用法
                
 
    
           
            
            
                
            
評(píng)論