interfaceとは
interfaceは複数の信号(ポート)を一つにまとめる機能です。この機能を用いてモジュール同士の接続を行います。
通常はvirutalを付加してバーチャルインターフェイスとして使用します。
virtualの反対の意味はリアルです。virtualはリアルでないとい意味になります。
リアルな配線は一つしかできませんが、virtualを使用すると複数の配線を同じポートに接続できます。
データ転送用、データチェック用、データモニタ用などなど・・。
あと、接続にポート名を毎回書かなくてよくなります。
interface例
interfaceの例としてapbを記述します。
interfaceは「interface インターフェイス名」で始まり、「endinterface」で終わります。
interface apb_if(input bit pclk);
wire [31:0] paddr;
wire psel;
wire penable;
wire pwrite;
wire [31:0] prdata;
wire [31:0] pwdata;
endinterface
これにmodportという機能を追加してportの向きを決定します。
always文で変数の初期化やタスクもinterface内に記述できます。
interface apb_if(input logic pclk, input logic presetn);
logic [31:0] paddr ;
logic psel ;
logic penable ;
logic pwrite ;
logic [31:0] prdata ;
logic [31:0] pwdata ;
logic pready ;
logic pslverr ;
modport master (
output psel ,
output penable ,
output pwrite ,
output paddr ,
output pwdata ,
input prdata ,
input pready ,
input pslverr
) ;
modport slave (
input psel ,
input penable ,
input pwrite ,
input paddr ,
input pwdata ,
output prdata ,
output pready ,
output pslverr
) ;
always @(posedge pclk or negedge presetn) begin
if(!presetn) begin
psel <= 1'b0 ;
penable <= 1'b0 ;
pwrite <= 1'b0 ;
end
end
task apb_write(input [31:0] addr,input [31:0] data) ;
psel <= 1'b1 ;
paddr <= addr ;
pwrite <= 1'b1 ;
pwdata <= data ;
do begin
@(posedge pclk) ;
penable <= #1 1'b1 ;
end
while(pready != 1'b1) ;
#1 ;
psel <= 1'b0 ;
penable <= 1'b0 ;
endtask
task apb_read(input [31:0] addr,output [31:0] data) ;
psel <= 1'b1 ;
paddr <= addr ;
pwrite <= 1'b0 ;
do begin
@(posedge pclk) ;
data = prdata ;
penable <= #1 1'b1 ;
end
while(pready != 1'b1) ;
#1 ;
psel <= 1'b0 ;
penable <= 1'b0 ;
endtask
endinterface

コメント