インターフェース
インターフェースはソースコードの最上位コンポーネントの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
}
}