interface

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

コメント

Copied title and URL