目录
Verilog/SystemVerilog 中 Task 與 Function 的比較
一、基本差異
-
Task
- 可包含時間控制語句(如
#delay,@posedge) - 可有多個輸入、輸出或雙向端口(input/output/inout)
- 不直接返回值,通常通過輸出端口傳遞結果
- 支持調用其他 task 或 function
- 可包含時間控制語句(如
-
Function
- 不可包含時間控制語句(必須在零仿真時間內完成)
- 至少有一個輸入,且只能返回單一值(通過函數名返回)
- 通常用於組合邏輯計算
- 可調用其他 function,但不能調用 task
二、task 用法
- 用來把可重複的程序化流程封裝成一個可呼叫的區塊。
- 與
function不同:task允許時間控制(例如@,#,wait),可以有多個輸出,
沒有回傳值 (回傳用 output 形參[範例1]),也可以直接控制訊號 [範例2]。 - 而
function不可含時間控制、且必須在一個 simulation time step 內完成、有單一回傳值。
[範例1]
task add3;
input [31:0] a, b, c;
output [31:0] y;
begin
y = a + b + c; // 不含時間控制,純計算
end
endtask
reg [31:0] sum;
add3(1, 2, 3, sum); // sum = 6
[範例2]
reg task_signal;
initial begin
task_signal = 0;
end
task task_signal_op; begin
task_signal <= ~task_signal;
end endtask
always @(negedge clk) begin
task_signal_op;
end
[範例3] 帶延遲的 Task
task automatic delay_print;
input [7:0] data;
input integer delay_time;
begin
#delay_time; // 時間控制語句
$display("Data: %h at time %t", data, $time);
end
endtask
// 調用範例
initial begin
delay_print(8'hAA, 10); // 延遲 10 單位後print
end
[範例4] 多輸出的 Task
task automatic swap;
inout [31:0] a, b;
reg [31:0] tmp;
begin
tmp = a;
a = b;
b = tmp;
end
endtask
// 調用範例
initial begin
reg [31:0] x = 32'h1234;
reg [31:0] y = 32'h5678;
swap(x, y);
end
三、Function 範例
[範例1] : 組合邏輯計算
function automatic [7:0] parity_calc;
input [7:0] data;
begin
parity_calc = ^data; // 返回奇偶校驗位
end
endfunction
// 使用function
wire [7:0] result = parity_calc(8'b11011001);
[範例2] : 遞歸 Function
function automatic integer factorial;
input integer n;
if (n <= 1) factorial = 1;
else factorial = n * factorial(n-1);
endfunction
// 使用function
integer fact_5 = factorial(5); // 返回 120
四、使用場景
-
Task 適用於
- 需要時間控制的操作(如測試平台激勵生成)
- 多信號協同處理(如協議模擬)
-
Function 適用於
- 純組合邏輯計算(如 CRC、數學運算)
- 需要直接返回值的場景(如數據轉換)
五、自動(automatic)與靜態(static)區別
-
automatic
- 每次調用獨立分配存儲空間
- 支持遞歸調用
-
static(默認)
- 共享存儲空間
- 需注意變量值可能被覆蓋
範例:
task automatic auto_task; // 自動變量
function static static_func; // 靜態變量(默認可省略)

4677

被折叠的 条评论
为什么被折叠?



