verilog中的task和function不同點如下:
1)函數只能與主模塊共同用同一個仿真時間單位,而任務可以定義自己的仿真時間單位;
2)函數不能啟動任務,而任務能啟動其他函數和任務;
3)函數至少要有一個輸入變量,而任務可以沒有或有多個任何類型的輸入變量;
4)函數返回一個值,而任務則不返回值;
函數的目的是通過返回一個值來響應輸入信號的值,verilog中使用函數時,把它當作表達式中的操作符,這個操作的結果的值就是函數的返回值;
任務能支持多種目的,能計算多個結果值,這些結果值只能通過被調用的任務的輸出或總線端口輸出。
function函數的使用規則:
1.函數的定義不能包含有任何的時間控制語句,即# @ 或wait語句;
2.函數不能啟動任務;
3.定義函數至少要有一個輸入參量;
4.在函數的定義中必須有一條賦值語句給函數中的一個內部變量賦以函數的結果值,該內部變量具有和函數名相同的名字;
function <返回值的類型或范圍> getbyte;
input [15:0] address;
begin
//<說明語句>
getbyte = result_expression;
end
endfunction
//<返回值的類型或范圍>這一個選項是可選的,如默認則返回值為一位寄存器類型的數據,即function reg getbyte;
module tryfact;
//函數的定義
function [31:0] factorial;
input [3:0] operand;
reg [3:0] index;
begin
factorial = 1;
for(index=2; index<=operand; index=index+1)
factorial = index * factorial;
end
endfunction
//函數的測試
reg [31:0] result;
reg [3:0] n;
initial begin
result = n * factorial(n)/((n*2)+1) //函數的調用
$display("final result: %d", result);
end
endmodule
task任務的使用規則:
如果傳給任務的變量值和任務完成后接收結果的變量已定義,就可以用一條語句啟動任務,任務完成以后任務就傳回啟動過程。
任務想要有輸出,必須定義output類型的變量,將值賦值給輸出類型的變量;
task my_task;
input a, b;
inout c;
output d, e;
<語句>
c = foo1;
d = foo2;
d = foo3; //對任務的輸出變量賦值
endtask
任務調用:my_tasks(v, w, x, y, z);
任務定義的變量和任務調用的變量是一 一對應的。
module traffic_lights;
reg clock, red, amber, green;
parameter on = 1, off = 0, reg_tics = 350, amber_tics = 500, green_tics = 150;
//交通燈初始化
initial reg = off;
initial amber = off;
initial green = off;
//交通燈控制時序
always begin
red = on;
light(red, red_tics); //調用等待任務
green = on;
light(green, green_tics);
amber = on;
light(amber, amber_tics);
end
// 定義task任務
task light;
output color;
input [31:0] tics;
begin
repeat(tics)
@(posedge clock);
color = off;
end
endtask
//產生時鍾
always begin
#100 clock = 0;
#100 clock = 1;
end
endmodule