SV
モジュールの定義は、module と endmodule の間に記述する
module sample_mod (
input a, b,
output y ); // ここまでがモジュールヘッダ。最後に ';' が必要。
.... // モジュール本体。動作などを記述
endmodule // ';' などの区切り文字は不要
module の次にはモジュール名を定義。
モジュール名に使える文字列は、1文字目がアルファベットか _、2文字目以降はそれらに数字が加わる。
続けてポート宣言などを記述する。ここまでをモジュールヘッダと呼ぶ。モジュールヘッダについてはこちらを参照
その後にモジュールの動作などを定義する。この部分をモジュール本体と呼ぶことにする。後で説明
モジュール定義の最後には endmodule を記述する。endmodule の後に '; ' などの区切り文字は不要。
endmodule : sample_mod のように、コロンの後にモジュール名をつけてもよい。
モジュールヘッダが non-ansi 型。古い
module_nonansi_header [ timeunits_declaration ] { module_item } endmodule [ : module_identifier ]
モジュールヘッダが ansi 型。こちらが主流。
module_ansi_header [ timeunits_declaration ] { non_port_module_item } endmodule [ : module_identifier ]
ポート並びが ( .* ) のタイプ
{ attribute_instance } module_keyword [ lifetime ] module_identifier ( .* ) ; [ timeunits_declaration ] { module_item } endmodule [ : module_identifier ]
module 本体を定義するスタイル ( module , endmodule で囲む ) と extern をつける2種類がる。extern でモジュールヘッダだけ宣言するタイプ。本体は別の場所に記述する。ansi, nonasi どちらも書けるが ( . * ) は書けない。
extern module_nonansi_header
同上
extern module_ansi_header
トップ階層に記述できる
module 本体 ( 入れ子モジュール )
モジュールの本体の中に他のモジュールのインスタンスを記述することで、モジュール階層を構築できる。下位ブロックとの通信はそのブロックのポートとの接続により実現する。Module Instantiation
module 本体の中で module を定義できる。書き方はトップの場合と同じ。
どこにもインスタンスされていないモジュールはトップ階層とみなされる。SystemVerilog では複数のトップ階層が存在できる。
以下が書ける。どの順序でもよく、何回でもよい。ただし nonansi の場合は、これらの前に port 宣言が必要
ここで重要なのは、動作は initial, always, final のどれかの中にしか記述できない、ということ。
module test ( input a, b, output y );
// 種々の記述
// タイムユニット宣言
// モジュール定義
// インターフェイス定義
// program 定義
// parameter 再定義
// always 文
// assign 文
// 下位モジュールのインスタンス
// interface のインスタンス
// assert, bind
// generate
// initial, final
// program
endmodule
モジュール本体は構文上は空白でもかまわない。
module empty_module ( ) ;
endmodule
ansi 型のモジュール本体で定義されるのは non_port_module_item
non_port_module_item ::=
generate_region
| module_or_generate_item // 下
| specify_block
| { attribute_instance } specparam_declaration
| program_declaration
| module_declaration // モジュール宣言の入れ子
| interface_declaration
| timeunits_declaration // 直前の定義と同じことを繰り返すなら記述してもいいらしい
module_or_generate_item ::=
{ attribute_instance } parameter_override // defparam のこと
| { attribute_instance } gate_instantiation
| { attribute_instance } udp_instantiation
| { attribute_instance } module_instantiation
| { attribute_instance } module_common_item // 下
module_common_item
module_or_generate_item_declaration // 下
| interface_instantiation
| program_instantiation
| assertion_item
| bind_directive
| continuous_assign
| net_alias
| initial_construct
| final_construct
| always_construct
| loop_generate_construct
| conditional_generate_construct
| elaboration_system_task
module_or_generate_item_declaration ::=
package_or_generate_item_declaration // 下
| genvar_declaration
| clocking_declaration
| default clocking clocking_identifier ;
| default disable iff expression_or_dist ;
package_or_generate_item_declaration ::=
net_declaration
| data_declaration
| task_declaration
| function_declaration
| checker_declaration
| dpi_import_export
| extern_constraint_declaration
| class_declaration
| class_constructor_declaration
| local_parameter_declaration ;
| parameter_declaration ;
| covergroup_declaration
| overload_declaration
| assertion_item_declaration
| ;