UVM 1.0では、Virtual Interfaceの使い方を示してくれます。
すべてのコードは、interface.svファイルに記述されています。
すべてのコードは、interface.svファイルに記述されています。
// 途中略 package top_pkg; // Virtual Interfaceであるpin_ifをtypedefでpin_vifに! // SystemVerilogでは、Virtual Interfaceをtypedefできる! typedef virtual pin_if pin_vif; endpackage // 途中略 class driver extends uvm_component; pin_vif pif; // Virtual Interface : pin_vif型のpif function new(string name, uvm_component parent = null); super.new(name, parent); endfunction function void connect_phase(uvm_phase phase); // connect_phaseにて、read_by_nameを使ってpifに接続する assert(uvm_resource_db#(pin_vif)::read_by_name(get_full_name(), "pif", pif)); endfunction task run_phase(uvm_phase phase); forever begin @(posedge pif.clk); `uvm_info("driver", "posedge clk", UVM_NONE); //... end endtask endclass // 途中略 module top; import top_pkg::*; bit clk; clkgen ck(clk); pin_if pif(clk); env e; dut d(pif.slave_mp); initial begin e = new("env"); // set関数を使って、'''env.driver'''の'''pif'''に、 // 上記に宣言した(pin_if pif(clk))のpifを接続する uvm_resource_db#(pin_vif)::set("env.driver", "pif", pif); // set関数にて接続した情報を表示する。 uvm_resource_db#(pin_vif)::dump(); run_test(); //$finish; end endmodule
UVM 1.0では、Virtual Interfaceへの接続には、
・uvm_resource_db#(pin_vif)::read_by_name(get_full_name(), "pif", pif)); ・uvm_resource_db#(pin_vif)::set("env.driver", "pif", pif);を使っています。
read_by_nameタスクの第1引数では固定値ではなく、
get_full_name関数にてパス名を獲得しています。
こうすることで、driverクラスがインスタンス化されたときのパス名を
正しく獲得することができます。
Virtual Interfaceを設定する部分では、set関数にて設定しますが、
このときの第1引数はenv.driverのように固定値にしています。
get_full_name関数にてパス名を獲得しています。
こうすることで、driverクラスがインスタンス化されたときのパス名を
正しく獲得することができます。
Virtual Interfaceを設定する部分では、set関数にて設定しますが、
このときの第1引数はenv.driverのように固定値にしています。
検証、Verification、SystemVerilog、UVM、Unified Verification Methodology