interface

インターフェースの定義用に追加されました。

interface定義を使いことで、さまざまなメリットがあるかと思いますが、ここではモデルの接続を行うときに使うvirtual interfaceについて書きます。virtual interfaceとは、どこかのmodule内に組み込んだinterfaceを、特定のclass内に仮想接続することをいいます。仮想接続することで、module階層のどこと接続するかに関わらず特定のmodule内にclass群を組み込むことができます。OVMやUVMで記述したclassベースのモデルにも使います。

文法としては、moduleの中にinterfaceを普通にインスタンスするdriverやmonitorといった、moduleの信号と接続の必要なclassの中に、

    • virtual $interface_name $inst
    • $interface_name : interfaceの名前
    • $inst : インスタンス名

を組み込む。

以下のようなfunctionを組み込む。$instがlocal_ifだとすれば

function void assign_vi (virtual interface $interface_name $inst);

local_if = $inst

endfunction

moduleのinitial文の中でassign_viを呼び出し、引数にinterfaceのインスタンス名を記述する、となります。以下、記述例です。

--- test_top.sv ---

interface sample_if(input logic CLK);
  logic [7:0]  ADDR;
  logic [31:0] DATA;
  initial begin
    $monitor("ADDR=%xh",ADDR);
  end
endinterface


module test_top;
  logic CLK;
  sample_if sif(.CLK);
  class test;
    virtual sample_if lif;
    function void assign_vi(virtual interface sample_if vif);
      lif = vif;
    endfunction
    task trans(logic [7:0] this_addr);
      @(posedge lif.CLK);
      lif.ADDR=this_addr;
    endtask
    task body;
      trans(8'h10);
      trans(8'h20);
      #10 $finish;
    endtask
  endclass
  initial begin
    CLK = 1'b1;
    forever #10 CLK = !CLK;
  end
  initial begin
    test vif_test = new;
    vif_test.assign_vi($root.test_top.sif);
    vif_test.body;
  end
endmodule