21 / 37 · 概念
function automatic 與運算式重用
編寫不消耗時間的函式,檢查回傳值位元寬度、符號與參考模型獨立性。
單元可免費閱讀,註冊課程即可儲存學習進度。
重用計算,不隱藏契約
SystemVerilog 函式不消耗模擬時間。可合成組合函式依賴顯式輸入,所有路徑賦回傳值,不含延遲或事件控制。automatic 給每次呼叫獨立的參數與區域變數儲存,不增加暫存器或一拍。以下固定次數迴圈計算八位 XOR,得到組合奇偶校驗。
module parity_function (
input logic [7:0] data,
output logic parity,
output logic [7:0] with_parity
);
function automatic logic parity8(input logic [7:0] value);
logic p;
integer bit_index;
begin
p = 1'b0;
for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
p = p ^ value[bit_index];
parity8 = p;
end
endfunction
assign parity = parity8(data);
assign with_parity = {data[6:0], parity8(data)};
endmodulewith_parity 有意丟棄 data[7] 後附加 parity,只有八位,不是保留完整輸入的九位編碼。輔助函式正確,呼叫者仍可能丟資訊。
回傳位元寬度與符號很重要
這裡回傳一位 logic。若兩個無號八位數相加且要保留進位,函式須回傳九位。呼叫不會自動儲存額外進位或擴大目標。把常量與位元寬度規則放在介面附近,不要讓函式偷偷讀取變化的全域訊號;隱藏依賴會妨礙重用和驗證。
函式呼叫不等於序列共享硬體
呼叫同一函式兩次不強制合成出一個分時運算器。工具可以最佳化組合邏輯,但序列共享需要接受策略、狀態與輸出時刻。不能僅按呼叫次數估計面積或吞吐量。測試平台中等待事件的刺激和檢查用 task,與不消耗時間的函式分工;後面的 task 在下降緣驅動並在下一上升緣後檢查。
練習:使用另一種參考演算法
data=0,1,3,8'h80,8'hFF 的 parity 應為 0,1,0,1,0。8'h80 時高位被丟棄,末位 parity=1,因此 with_parity=8'h01。遍歷全部 256 個輸入,以整數值為1的位元數模 2 為參照,不呼叫 DUT 的 parity8。
把迴圈上限改成 7,確認 8'h80 測試失敗;只測低位無法發現遺漏。再用 {data,parity8(data)} 把輸出改為九位並更新期望模型,這是介面改變而非格式改進。
✓ 已學習