:定義乙個任務。
task task_demo; //任務定義結構開頭,命名為 task_demo
input [7:0] x,y; //輸入埠說明
output [7:0] tmp; //輸出埠說明
if(x>y) //給出任務定義的描述語句
tmp = x;
else
tmp = y;
endtask
上述**定義了乙個名為「task_demo」的任務,求取兩個數的最大值。在定義任務時,
有下列六點需要注意:
(1)在第一行「task」語句中不能列出埠名稱;
(2)任務的輸入、輸出埠和雙向埠數量不受限制,甚至可以沒有輸入、輸出以及
雙向埠。
(3)在任務定義的描述語句中,可以使用出現不可綜合操作符合語句(使用最為頻繁
的就是延遲控制語句) ,但這樣會造成該任務不可綜合。
(4)在任務中可以呼叫其他的任務或函式,也可以呼叫自身。
(5)在任務定義結構內不能出現 initial和 always過程塊。
(6)在任務定義中可以出現「disable 中止語句」 ,將中斷正在執行的任務,但其是不
可綜合的。當任務被中斷後,程式流程將返回到呼叫任務的地方繼續向下執行。
2.任務呼叫
雖然任務中不能出現 initial 語句和 always 語句語句, 但任務呼叫語句可以在 initial 語句
和 always 語句中使用,其語法形式如下:
task_id[(埠1, 埠 2, ........, 埠 n)];
其中 task_id是要呼叫的任務名,埠 1、埠 2,…是引數列表。引數列表給出傳入任
務的資料(進入任務的輸入端)和接收返回結果的變數(從任務的輸出端接收返回結果) 。
任務呼叫語句中,引數列表的順序必須與任務定義中的埠宣告順序相同。任務呼叫語句是
過程性語句,所以任務呼叫中接收返回資料的變數必須是暫存器型別。下面給出乙個任務調
用例項。
例:通過 verilog hdl 的任務呼叫實現乙個 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 = ;
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 = ;
cout = s3[1];
end
endmodule
在呼叫任務時,需要注意以下幾點:
(1)任務呼叫語句只能出現在過程塊內;
(2)任務呼叫語句和一條普通的行為描述語句的處理方法一致;
(3)當被呼叫輸入、輸出或雙向埠時,任務呼叫語句必須包含埠名列表,且訊號
埠順序和型別必須和任務定義結構中的順序和型別一致。需要說明的是,任務的輸出埠
必須和暫存器型別的資料變數對應。
(4)可綜合任務只能實現組合邏輯,也就是說呼叫可綜合任務的時間為「0」 。而在面
向**的任務中可以帶有時序控制,如時延,因此面向**的任務的呼叫時間不為「0」 。
verilog中的task用法
定義乙個任務。task task demo 任務定義結構開頭,命名為 task demo input 7 0 x,y 輸入埠說明 output 7 0 tmp 輸出埠說明 if x y 給出任務定義的描述語句 tmp x else tmp y endtask 上述 定義了乙個名為 task demo...
4 3 verilog中的task用法與例子
任務就是一段封裝在 task endtask 之間的程式。任務是通過呼叫來執行的,而且只有在呼叫時才執行,如果定義了任務,但是在整個過程中都沒有呼叫它,那麼這個任務是不會執行的。呼叫某個任務時可能需要它處理某些資料並返回操作結果,所以任務應當有接收資料的輸入端和返回資料的輸出端。另外,任務可以彼此呼...
Verilog中generate的用法
一 generate verilog 2001新增了generate迴圈,允許產生module和primitive的多個例項化,同時也可以產生多個variable,net,task,function,continous assignment,initial和always。在generate語句中可以...