プロトタイプ
プロトタイプは特別なジェネリック境界で、ジェネリックパラメータに渡せるプロトタイプを示します。現在はモジュールプロトタイプのみがサポートされています。
以下の例では、ProtoA
がパラメータ A
とポート i_dat
o_dat
を持つモジュールプロトタイプです。T: ProtoA
のように制約することで、ジェネリックパラメータ T
がそれらのパラメータとポートを持つ必要があることが示されます。
プロトタイプを使うには for
による実装が必要です。ModuleC
と ModuleD
は for ProtoA
指定により、 ProtoA
の条件を満たすことが示されています。これにより、それらのモジュールは ModuleB
の ジェネリックパラメータ T
として使用できるようになります。
module ModuleA {
inst u0: ModuleB::<ModuleC>;
inst u1: ModuleB::<ModuleD>;
}
proto module ProtoA #(
param A: u32 = 1,
) (
i_dat: input logic,
o_dat: output logic,
);
module ModuleB::<T: ProtoA> {
inst u: T (
i_dat: 0,
o_dat: _,
);
}
module ModuleC for ProtoA #(
param A: u32 = 1,
) (
i_dat: input logic,
o_dat: output logic,
) {
assign o_dat = i_dat;
}
module ModuleD for ProtoA #(
param A: u32 = 1,
) (
i_dat: input logic,
o_dat: output logic,
) {
assign o_dat = ~i_dat;
}