SV
generate 文には以下の2種類がある
loop 型
条件型
generate 文は generate と endgenerate で囲むこともあるが、これはなくてもよい。generate と endgenerate で囲まれた部分を generate 領域とよぶ
generate // generate, endgenerate はなくてもよい
...
endgenerate
loop 型の例
module test ...
....
genvar i; // genvar は generate region の内外どちらでも宣言できる
generate // generate ... endgenerate は省略可
for ( i = 0; i < SIZE; i++ ) begin : kk
... // genvar は localparam と同じ効果
end
endgenerate
module test ;
generate
for ( genvar i = 0; i < AA; i++ ) begin : kk
fifo u_fifo ( .... ) ;
end
endgenerate
// この場合、test.kk [0].u_fifo になる
// ": kk" が省略されたときは test.genblk1 [0].u_fifo
// genblk<n> n は 1 から順番につけられる
generate_region は non_port_module_item のひとつ
generate_region ::=
generate { generate_item } endgenerate
generate_item ::=
module_or_generate_item | interface_or_generate_item | checker_or_generate_item
module_or_generate_item // モジュール本体で見た
interface_or_generate_item ::=
{ attribute_instance } module_common_item // ここに loop / conditional generate がある
| { attribute_instance } modport_declaration
| { attribute_instance } extern_tf_declaration
// module_common_item の一つに loop_generate_construct がある
loop_generate_construct ::=
for ( genvar_initialization ; genvar_expression ; genvar_iteration ) generate_block // genvar_exp は定数式
genvar_initialization ::= [ genvar ] genvar_id = const_exp
genvar_iteration ::=
genvar_identifier assignment_operator genvar_expression
| inc_or_dec_operator genvar_identifier | genvar_identifier inc_or_dec_operator
generate_block ::=
generate_item
| [ generate_block_identifier : ] begin [ : generate_block_identifier ] { generate_item }
end [ : generate_block_identifier ]
generate_item ::=
module_or_generate_item
| interface_or_generate_item
| checker_or_generate_item
// 再帰になってるな
// module_common_item の一つに conditional_generate_construct がある
conditional_generate_construct ::=
if_generate_construct
| case_generate_construct
if_generate_construct ::=
if ( constant_expression ) generate_block [ else generate_block ] // generate_block は上で定義したもの
case_generate_construct ::=
case ( constant_expression ) case_generate_item { case_generate_item } endcase
case_generate_item ::=
constant_expression { , constant_expression } : generate_block
| default [ : ] generate_block