Verilog 2001 から generate 構文を使って、module, assertion 等のインスタンスや、assign による接続などができます。ここではループを使った生成の話です。
Loop generate
for loop 構文を使って複数インスタンスができます。loop generate の場合、genvar で generate 用の変数を宣言して for loop 内で使います。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
変数 i はコンパイル時のみ使われ、シミュレーション時には存在しません。。
generate ~ endgeneate キーワード
generate ~ endgenerate というキーワードを使って、generate 箇所を明示できます。書いても書かなくても同じです。
genvar は generate ~ endgenerate の内外どちらにも記述できますが、変数のスコープは影響しないので、外側に書く方がわかりやすいと思う。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
generate begin ~ end endgenerate のように begin/end を使うと変数のスコープができます。
階層の名前付け
loop generate によりひとつ新しい階層ができます。
ラベルを付けて、generate block の名前を決められます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 |
SystemVerilog の記述
SystemVerilog の場合、for 内に genvar を記述できます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
for (genvar i = 0; i < SIZE; i++) begin | |
m i_m(.clk(clk), .rst_n(rst_n), .x(x[i]), .y(y)); | |
end |
この場合、変数 i は、この for loop 内でのみ有効です。
See Also
- IEEE Std 1364™-2005: 12.4.1 Loop generate constructs
- IEEE Std 1800™-2012: 27.4 Loop generate constructs