Altifigence Academy

20 / 37 · 概念

generate:用迴圈構建靜態電路

用 genvar 與 generate-if 生成具名結構,檢查匯流排 lane 佈局。

generate 迴圈生成例項,不是時脈週期

genvar 與 generate 描述靜態重複結構,展開器在執行前建立全部例項。always_comb 內的迴圈描述過程計算,合成確定硬體。兩者都不自動錶示每拍一輪;序列處理要明確狀態和時脈控制器。下面把 packed 輸入分成 LANES 個 W 位字,分別算奇偶校驗。W 和 LANES 均為正整數。

SystemVerilog
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
endmodule

data[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,以及對照當前匯流排還是前一時脈邊緣取樣值。

此選擇適用於本瀏覽器,隨時可從頁尾變更。