3 / 37 · 概念
模組、埠與例項:把連線當作契約
用具名連線組合模組,檢查單一驅動來源與層次邊界。
單元可免費閱讀,註冊課程即可儲存學習進度。
模組邊界不是時脈邊界
模組組織埠和內部邏輯。例項化不會自動建立暫存器或增加一拍。串聯的組合模組仍是組合路徑,物理延遲相加;時脈暫存器才是明確的儲存邊界。埠契約要寫方向、位元寬度、符號、驅動來源和有效時刻,具名連線無需記憶位置順序。
module select_word #(parameter integer W = 8) (
input logic [W-1:0] a, b,
input logic select_b,
output logic [W-1:0] y
);
assign y = select_b ? b : a;
endmodule
module choose_and_increment (
input logic [7:0] a, b,
input logic select_b,
output logic [8:0] result
);
logic [7:0] chosen;
select_word #(.W(8)) select_u (
.a(a), .b(b), .select_b(select_b), .y(chosen)
);
assign result = {1'b0, chosen} + 9'd1;
endmoduleselect_word 是模組型別,select_u 是例項名。.a(a) 把子模組 a 埠連到父模組 a 訊號。.W(8) 在展開設計時確定,不是執行時埠值。
檢查連線的兩端
chosen 只有子模組 y 一個驅動來源,父模組讀取它。不要再在父模組其他過程中賦值;logic 不允許衝突驅動。result 是 9 位,因為 255+1=256,先透過連線操作擴展 chosen 再加。a=255,b=9 時 select_b=0 得 256,select_b=1 得 10;縮到 8 位會丟掉第一種結果的進位。
層次、檔案與 top
兩個定義可放同一或不同檔案,但編譯器必須收到全部檔案。top 是 choose_and_increment;選擇 select_word 會測試不同的邊界。遺漏子模組定義是檔案清單問題,不證明埠邏輯錯誤。位置連線在埠清單改變時可能悄悄改變含義。未連線輸入不是有意的 0;明確連線常量或註明未用輸出,並檢查診斷。也要追蹤層次內訊號,避免無儲存的組合反饋環,模組邊界不會自動切斷環。
練習:獨立驗證組合
(a,b,select_b)=(0,255,0),(0,255,1),(255,0,0),(255,0,1) 的期望依次是 1,256,256,1。對兩種 select 分別遍歷所選輸入的 256 個值,未選輸入要不同,避免相同輸入掩蓋反選錯誤。
參考模型獨立選擇 a 或 b 的整數值,加 1 後在組合路徑穩定時比較 9 位結果。不要讀取 DUT 內部 chosen,否則會共享錯誤選擇。最後嘗試加輸出暫存器,明確重置是否同步、結果何時有效、對應哪個輸入時脈邊緣;算術不變也會改變時間契約。