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はとっても役に立ちます。