interface
interfaceは、SystemVerilogで導入されました。
機能モジュールは何らかの信号線の固まりで内部バスなどに接続します。
Verilog HDL/VHDLでは各信号線毎に接続しなければいけません。
SystemVerilogでは、interfaceという機能を使うと、もっとスマートに機能モジュール間を接続することができます。
例えば、次のような信号を持つ内部バスを考えます。
logic ADDR[31:0];
logic RD;
logic CS;
logic RD_DATA[31:0];
logic WR_DATA[31:0];
この内部バスを持つ機能モジュールへの接続は、次のようになりますね!
FUNC_A u_func_a (
.ADDR(ADDR_FUNC_A),
.RD(RD_FUNC_A),
.CS(CS_FUNC_A),
.RD_DATA(RD_DATA_FUNC_A),
.WR_DATA(WR_DATA_FUNC_A),
.....
);
INT_BUS u_int_bus (
.....
.ADDR_FUNC_A(ADDR_FUNC_A),
.RD_FUNC_A(RD_FUNC_A),
.CS_FUNC_A(CS_FUNC_A),
.RD_DATA_FUNC_A(RD_DATA_FUNC_A),
.WR_DATA_FUNC_A(WR_DATA_FUNC_A),
.....
);
これをSystemVerilogのinterface機能を用いると次のように書き直せます。
interface INT_BUS_IF( input logic CLK, RST) ;
logic ADDR[31:0];
logic RD;
logic CS;
logic RD_DATA[31:0];
logic WR_DATA[31:0];
modport master(
output ADDR,
output RD,
output CS,
input RD_DATA,
output WR_DATA
);
modport slave(
input ADDR,
input RD,
input CS,
output RD_DATA,
input WR_DATA
);
endinterface : INT_BUS_IF
INT_BUS_IF if_func_a;
FUNC_A u_func_a (
.PORT( if_func_a.slave ),
.....
);
INT_BUS u_int_bus (
.....
.PORT_FUNC_A(if_func_a.master),
.....
);
interface部分の記述は追加されますが、u_func_aとu_int_busの部分はすっきりしました。
最近のコードは、このような機能モジュールと内部バスの接続が非常に多くなっているので、interfaceはとっても役に立ちます。