Altifigence Academy

20 / 37 · 概念

generate:反復で静的回路を作る

genvarとgenerate-ifで名前付き構造を作り、バスのlane配置を確認します。

generateループはサイクルではなくインスタンスを作ります

genvarとgenerateは静的構造の反復であり、実行前に全インスタンスを作ります。always_comb内のループは手続き計算を記述し、合成が回路を決めます。いずれも自動的に1クロック1反復にはなりません。直列処理には状態とクロック制御器が必要です。

この例はpackedバスをWビットのLANESワードに分け、ワードごとにパリティを計算します。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はelaboration済みインスタンス内で定数です。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です。左の16進バイトはlane 2です。数値インデックス・表示順・伝送順を区別します。全laneは同時に計算し、登録遅延はありません。LANES増加は組合せ回路を増やし、サイクル数を増やすわけではありません。fanout・配線・物理タイミングは別途検査します。

generate-ifは固定構造を選びます

条件はレジスタを含めるparameterなどelaboration時の定数です。動作中信号は組合せまたはクロックブロックで使います。登録の有無は有効時点も変えるためポート文書と検査器へ反映します。0でバスを無効化しないでください。[−1:0]は安全な0幅ではありません。無効設定を拒否するか、外部インターフェースを明確に保つgenerate分岐を作ります。

実習・lane入替えを検出する

例の後、各laneの1ビットを順に立て、対応パリティだけが変わることを確認します。ワードの2ビットを立てた場合は偶数パリティ0です。同じデータを全laneへ入れる検査ではslice入替えを見逃します。

独立検査器は数値演算でlaneを取り出して1の個数を数えます。W=1,8、LANES=1,3でバイト幅・階層・最小設定の仮定を検査します。最後にパリティをレジスタへ保存し、resetとenableを定め、現在バスか前のエッジで保存したバスを参照するか規定します。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。