インターフェース
インターフェースはソースコードの最上位コンポーネントの1つです。インターフェースはオーバーライド可能なパラメータ、インターフェース定義を持ちます。
オーバーライド可能なパラメータについてはモジュールと同じです。
インターフェース定義では modport
を宣言することができます。modport
はモジュールのポート宣言で、ポートを束ねて接続するために使うことができます。
interface InterfaceA #(
param ParamA: u32 = 0,
param ParamB: u32 = 0,
) {
var a: logic;
var b: logic;
modport master {
a: output,
b: input ,
}
modport slave {
b: input ,
a: output,
}
}
さらに、import
キーワードを付けて指定された関数は modport を通して呼び出すことができます。
interface InterfaceA {
var a: logic;
var b: logic;
function a_and_b -> logic<2> {
return {a, b};
}
modport mp {
a : input ,
b : input ,
a_and_b: import,
}
}
module ModuleA (
ab_if: modport InterfaceA::mp,
) {
let _ab: logic<2> = ab_if.a_and_b();
}
modportのデフォルトメンバー
modportの全てのメンバーを指定する代わりに、以下のようにデフォルトメンバーを指定することができます。
..input
: インターフェース内の全ての変数をinput
として追加..output
: インターフェース内の全ての変数をoutput
として追加..same(modport_name)
:modport_name
と同じ変数を同じ方向で追加..converse(modport_name)
:modport_name
と同じ変数を、方向を逆にして追加
デフォルトメンバーの指定は通常の明示的なメンバーと一緒に使うこともできます。
interface InterfaceA {
var a: logic;
var b: logic;
var c: logic;
modport master {
a: output,
b: input ,
c: input ,
}
modport slave {
..converse(master)
}
modport monitor {
..input
}
modport driver {
b: input,
..output
}
}
インターフェースインスタンスとmodportポートの接続
インターフェースインスタンスとmodportポートは、SystemVerilogと同様に、互換性のあるモジュールポートあるいは generic
インターフェースに接続することができます。
interface InterfaceA {
var a: logic;
modport mp {
a: output,
}
}
module ModuleA (
foo_if: modport InterfaceA::mp,
bar_if: modport InterfaceA::mp,
) {
always_comb {
foo_if.a = '0;
bar_if.a = '0;
}
}
module ModuleB (
foo_if: modport InterfaceA::mp,
) {
inst bar_if: InterfaceA;
inst u: ModuleA (
foo_if: foo_if,
bar_if: bar_if,
);
}