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