20 / 37 · 概念
generate:用迴圈構建靜態電路
用 genvar 與 generate-if 生成具名結構,檢查匯流排 lane 佈局。
單元可免費閱讀,註冊課程即可儲存學習進度。
generate 迴圈生成例項,不是時脈週期
genvar 與 generate 描述靜態重複結構,展開器在執行前建立全部例項。always_comb 內的迴圈描述過程計算,合成確定硬體。兩者都不自動錶示每拍一輪;序列處理要明確狀態和時脈控制器。下面把 packed 輸入分成 LANES 個 W 位字,分別算奇偶校驗。W 和 LANES 均為正整數。
module lane_parity #(
parameter integer W = 8,
parameter integer LANES = 3
) (
input logic [W*LANES-1:0] data,
output logic [LANES-1:0] parity
);
genvar lane;
generate
for (lane = 0; lane < LANES; lane = lane + 1) begin : g_lane
wire [W-1:0] word_data;
assign word_data = data[lane*W +: W];
assign parity[lane] = ^word_data;
end
endgenerate
endmoduledata[base +: W] 從 base 向較大位號選擇 W 位,W 在展開例項中固定。W=8,LANES=3 時 lane 0 取 7:0,1 取 15:8,2 取 23:16。具名 g_lane 提供 g_lane[1].word_data 等可觀察層次。
從宣告讀取 lane 順序
data=24'h03_01_80 時,從 lane 0 起為 80,01,03,校驗位為 1,1,0,顯示 parity[2:0]=011。最左十六進位制位元組是 lane 2,不是 0。區分數值索引、顯示次序與傳輸次序。各 lane 併發,沒有註冊延遲,增大 LANES 增加組合邏輯而非週期數。物理扇出、佈線和時序需另查。
generate-if 選擇固定結構
條件必須是展開常量,例如是否包含暫存器的參數。執行時訊號應放在組合或時脈塊中。註冊/不註冊也改變有效時刻,要同步修改介面和檢查器。不要用 0 來關閉本匯流排:[−1:0] 不是安全的零寬物件。拒絕不支援配置或用保持外部介面明確的靜態分支。
練習:檢測 lane 交換
驗證給定例子,然後在每個 lane 依次置一位,只有對應校驗位改變。一個字置兩位時偶校驗為 0。所有 lane 輸入一樣會掩蓋切片交換。獨立檢查器用數值運算提取 lane、統計值為1的位元數;測 W=1,8 和 LANES=1,3,覆蓋位元組寬、層次和最小配置假設。最後嘗試註冊校驗向量,明確 reset/enable,以及對照當前匯流排還是前一時脈邊緣取樣值。