モジュール
モジュールはソースコードの最上位コンポーネントの1つです。モジュールはオーバーライド可能なパラメータ、接続ポート、内部ロジックを持ちます。
オーバーライド可能なパラメータは #()
内で宣言できます。それぞれのパラメータ宣言は param
キーワードで始まり、識別子、:
、パラメータの型、デフォルト値で構成されます。
接続ポートは ()
内で宣言できます。それぞれのポート宣言は識別子、:
、ポートの方向、ポートの型で構成されます。利用可能なポート方向は以下の通りです。
input
:入力ポートoutput
:出力ポートinout
:双方向ポートmodport
:インターフェースのmodportinterface
: ジェネリックインターフェース
module ModuleA #(
param ParamA: u32 = 0,
param ParamB: u32 = 0,
) (
a: input logic,
b: input logic,
c: input logic,
x: output logic,
) {
always_comb {
if c {
x = a;
} else {
x = b;
}
}
}
ポートのデフォルト値
モジュールのポートはデフォルトを持つことができます。デフォルト値を持つポートはインスタンス時に省略することができ、省略されたポートにはデフォルト値が割り当てられます。デフォルト値としては以下の値を取ることができます。
- 入力ポート: リテラル、パッケージ内の
const
- 出力ポート:
_
(無名識別子)
module ModuleA (
a: input logic ,
b: input logic = 1,
x: output logic ,
y: output logic = _,
) {
assign x = a;
assign y = b;
}
module ModubeB {
inst instA: ModuleA (
a: 1,
// b は省略
x: _,
// y は省略
);
}
ジェネリックインターフェース
ジェネリックインターフェースは特別なポート方向指定です。interface
が指定されたとき、そのポートには任意のインターフェースを接続可能です。interface::ModPort
のように modport を付けることもできます。この場合、ModPort
を持つインターフェースだけが接続できます。
module ModuleA (
bus_if : interface,
slave_if: interface::slave,
) {}