大家好,又到了每日學習的時間了,今天我們來聊一聊FPGA verilog中的task用法。
任務就是一段封裝在“task-endtask”之間的程序。任務是通過調(diào)用來執(zhí)行的,而且只有在調(diào)用時才執(zhí)行,如果定義了任務,但是在整個過程中都沒有調(diào)用它,那么這個任務是不會執(zhí)行的。調(diào)用某個任務時可能需要它處理某些數(shù)據(jù)并返回操作結(jié)果,所以任務應當有接收數(shù)據(jù)的輸入端和返回數(shù)據(jù)的輸出端。另外,任務可以彼此調(diào)用,而且任務內(nèi)還可以調(diào)用函數(shù)。
1.任務定義
任務定義的形式如下:
task task_id;
[declaration]
procedural_statement
endtask
其中,關(guān)鍵詞 task 和 endtask 將它們之間的內(nèi)容標志成一個任務定義,task 標志著一個任務定義結(jié)構(gòu)的開始;task_id 是任務名;可選項 declaration 是端口聲明語句和變量聲明語句,任務接收輸入值和返回輸出值就是通過此處聲明的端口進行的;procedural_statement是一段用來完成這個任務操作的過程語句,如果過程語句多于一條,應將其放在語句塊內(nèi);endtask 為任務定義結(jié)構(gòu)體結(jié)束標志。下面給出一個任務定義的實例。
task task_demo; //任務定義結(jié)構(gòu)開頭,命名為 task_demo
input [7:0] x,y; //輸入端口說明
output [7:0] tmp; //輸出端口說明
if(x>y) //給出任務定義的描述語句
tmp = x;
else
tmp = y;
endtask
上述代碼定義了一個名為“task_demo”的任務,求取兩個數(shù)的最大值。在定義任務時,
有下列六點需要注意:
(1)在第一行“task”語句中不能列出端口名稱;
(2)任務的輸入、輸出端口和雙向端口數(shù)量不受限制,甚至可以沒有輸入、輸出以及雙向端口。
(3)在任務定義的描述語句中,可以使用出現(xiàn)不可綜合操作符合語句(使用最為頻繁的就是延遲控制語句) ,但這樣會造成該任務不可綜合。
(4)在任務中可以調(diào)用其他的任務或函數(shù),也可以調(diào)用自身。
(5)在任務定義結(jié)構(gòu)內(nèi)不能出現(xiàn) initial和 always過程塊。
(6)在任務定義中可以出現(xiàn)“disable 中止語句” ,將中斷正在執(zhí)行的任務,但其是不可綜合的。當任務被中斷后,程序流程將返回到調(diào)用任務的地方繼續(xù)向下執(zhí)行。
2.任務調(diào)用
雖然任務中不能出現(xiàn) initial 語句和 always 語句語句, 但任務調(diào)用語句可以在 initial 語句和 always 語句中使用,其語法形式如下: task_id[(端口1, 端口 2, ........, 端口 N)]; 其中 task_id是要調(diào)用的任務名,端口 1、端口 2,…是參數(shù)列表。參數(shù)列表給出傳入任務的數(shù)據(jù)(進入任務的輸入端)和接收返回結(jié)果的變量(從任務的輸出端接收返回結(jié)果) 。
任務調(diào)用語句中,參數(shù)列表的順序必須與任務定義中的端口聲明順序相同。任務調(diào)用語句是過程性語句,所以任務調(diào)用中接收返回數(shù)據(jù)的變量必須是寄存器類型。下面給出一個任務調(diào)用實例。
例:通過 Verilog HDL 的任務調(diào)用實現(xiàn)一個 4 比特全加器。
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)用任務時,需要注意以下幾點:
(1)任務調(diào)用語句只能出現(xiàn)在過程塊內(nèi);
(2)任務調(diào)用語句和一條普通的行為描述語句的處理方法一致;
(3)當被調(diào)用輸入、輸出或雙向端口時,任務調(diào)用語句必須包含端口名列表,且信號端口順序和類型必須和任務定義結(jié)構(gòu)中的順序和類型一致。需要說明的是,任務的輸出端口必須和寄存器類型的數(shù)據(jù)變量對應。
(4)可綜合任務只能實現(xiàn)組合邏輯,也就是說調(diào)用可綜合任務的時間為“0” 。而在面向仿真的任務中可以帶有時序控制,如時延,因此面向仿真的任務的調(diào)用時間不為“0” 。
今天就聊到這里,各位,加油。
-
FPGA
+關(guān)注
關(guān)注
1624文章
21573瀏覽量
600697
發(fā)布評論請先 登錄
相關(guān)推薦
評論