【Verilog / SystemVerilog】verilog task 與 function 比較&範例

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;  // 靜態變量(默認可省略)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值