https://blog.csdn.net/CrazyUncle/article/details/86164830
主要區別
共同點
1、任務和函數必須在module內定義和調用
2、在任務和函數中不能聲明wire
3、所有輸入/輸出都是局部寄存器
4、任務/函數執行完成后才返回結果。例如,若任務/函數中有forever語句,則永遠不會返回結果
任務
1、通常用於調試,或對硬件進行行為描述
2、可以包含時序控制(#延遲,@, wait)
3、可以有input,output,和inout參數
4、可以調用其他任務或函數
函數
1、通常用於計算,或描述組合邏輯
2、不能包含任何延遲;函數仿真時間為0
3、至少含有一個input參數並由函數名返回僅一個結果
4、可以調用其他函數,但不能調用任務
測試代碼
`timescale 1ns / 1ps
module task_and_function(
);
reg [1:0] a;
reg [1:0] b;
reg clk;
reg [2:0] sum;
reg [2:0] sub;
reg [2:0] sum_func;
reg [31:0] factorial_res; // 階乘結果
initial begin
clk = 0;
a = 0;
b = 0;
sum_func = function_1(a,b); //第一次調用函數計算和
task_1(a,b,sum,sub); //第一次調用任務計算和和差
@(negedge clk);
a = 2;
b = 1;
sum_func = function_1(a,b); //第二次調用函數計算和
task_1(a,b,sum,sub); //第二次調用任務計算和和差
factorial_res = factorial(3); //調用階乘函數
end
always #20 clk = ~clk;
//============ 任務和函數的共同點 =========
/*
任務和函數必須在module內定義和調用
在任務和函數中不能聲明wire
所有輸入/輸出都是局部寄存器
任務/函數執行完成后才返回結果。
例如,若任務/函數中有forever語句,則永遠不會返回結果
*/
//============ 任務 =========
/*
1、通常用於調試,或對硬件進行行為描述
2、可以包含時序控制(#延遲,@, wait)
3、可以有input,output,和inout參數
4、可以調用其他任務或函數
*/
task task_1;
input [1:0] a;
input [1:0] b;
output [2:0] sum;
output [2:0] sub;
reg [1:0] i;
begin
for(i=0;i<=2;i=i+1) begin
@(posedge clk);
$display("i=%d",i); // 經歷3個上升沿出結果
end
sum = a + b;
sub = a - b;
end
endtask
//============ 函數 =========
/*
1、通常用於計算,或描述組合邏輯
2、不能包含任何延遲;函數仿真時間為0
3、至少含有一個input參數並由函數名返回僅一個結果
4、可以調用其他函數,但不能調用任務
*/
function [2:0] function_1;
input [1:0] a;
input [1:0] b;
begin
function_1 = a + b; // 延遲為0
end
endfunction
// 階乘函數
function [31:0] factorial;
input [3:0] opa;
integer i;
begin
factorial = 1;
for(i=2;i<=opa;i=i+1)
factorial = factorial * i;
end
endfunction
endmodule
測試波形

