[Verilog][SystemVerilog] Loop generate による複数インスタンス

Verilog 2001 から generate 構文を使って、module, assertion 等のインスタンスや、assign による接続などができます。ここではループを使った生成の話です。

Loop generate

for loop 構文を使って複数インスタンスができます。loop generate の場合、genvar で generate 用の変数を宣言して for loop 内で使います。

genvar i;
for (i = 0; i < SIZE; i = i + 1) begin
// module m を SIZE 個インスタンス
m i_m(.clk(clk), .rst_n(rst_n), .x(x[i]), .y(y));
end
view raw
gistfile1.v
hosted with ❤ by GitHub

変数 i はコンパイル時のみ使われ、シミュレーション時には存在しません。。

generate ~ endgeneate キーワード

generate ~ endgenerate というキーワードを使って、generate 箇所を明示できます。書いても書かなくても同じです。

genvar は generate ~ endgenerate の内外どちらにも記述できますが、変数のスコープは影響しないので、外側に書く方がわかりやすいと思う。

generate
genvar i;
for (i = 0; i < SIZE; i = i + 1) begin
m i_m(.clk(clk), .rst_n(rst_n), .x(x[i]), .y(y));
end
endgenerate
generate
for (i = 0; i < SIZE; i = i + 1) begin // 上記宣言の genvar i が有効
m i_m(.clk(clk), .rst_n(rst_n), .x(x[i]), .y(y));
end
endgenerate
view raw
gistfile1.v
hosted with ❤ by GitHub

generate begin ~ end endgenerate のように begin/end を使うと変数のスコープができます。

階層の名前付け

loop generate によりひとつ新しい階層ができます。
ラベルを付けて、generate block の名前を決められます。

// foo[0].i_m ~ foo[SIZE-1].i_m がインスタンスされる
for (i = 0; i < SIZE; i = i + 1) begin : foo
m i_m(.clk(clk), .rst_n(rst_n), .x(x[i]), .y(y));
end
view raw
gistfile1.v
hosted with ❤ by GitHub

SystemVerilog の記述

SystemVerilog の場合、for 内に genvar を記述できます。

for (genvar i = 0; i < SIZE; i++) begin
m i_m(.clk(clk), .rst_n(rst_n), .x(x[i]), .y(y));
end
view raw
gistfile1.v
hosted with ❤ by GitHub

この場合、変数 i は、この for loop 内でのみ有効です。

See Also

  • IEEE Std 1364™-2005: 12.4.1 Loop generate constructs
  • IEEE Std 1800™-2012: 27.4 Loop generate constructs
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク