インターフェースの定義用に追加されました。
interface定義を使いことで、さまざまなメリットがあるかと思いますが、ここではモデルの接続を行うときに使うvirtual interfaceについて書きます。virtual interfaceとは、どこかのmodule内に組み込んだinterfaceを、特定のclass内に仮想接続することをいいます。仮想接続することで、module階層のどこと接続するかに関わらず特定のmodule内にclass群を組み込むことができます。OVMやUVMで記述したclassベースのモデルにも使います。
文法としては、moduleの中にinterfaceを普通にインスタンスするdriverやmonitorといった、moduleの信号と接続の必要なclassの中に、
を組み込む。
以下のような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); endendinterfacemodule 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; endendmodule