2016-08-09 16 views
0

私はインターフェイスのクラスを持っています。インターフェイスの2つのインスタンスに2つのインスタンスのモニタを作成する方法

Iにより上部におけるこのインターフェースの2つのインスタンスを作成します。私がして仮想インターフェースを作成するモニタで

//Interface declaration 
    pakmx_if_out vif_out[2](clk, rst); 
    //Registers the Interface in the configuration block 
    //so that other blocks can use it 
    uvm_resource_db#(virtual pakmx_if_out)::set(.scope("ifs"), .name("pakmx_if_out0"), .val(vif_out[0])); 
    uvm_resource_db#(virtual pakmx_if_out)::set(.scope("ifs"), .name("pakmx_if_out1"), .val(vif_out[1])); 

:また

//interface 
    virtual pakmx_if_out vif_out; 

、Iモニタでタスクを持っています上記インターフェースの信号にアクセスする。 エージェントのクラスに2つのインスタンスを作成して、それぞれのモニターが異なるインターフェースのインスタンスを参照する方法を教えてください。

は私がモニターのインスタンスを作成し、ビルドフェーズでそれを接続して、エージェントのフェーズを実行します。

//build phase 
    function void build_phase(uvm_phase phase); 
      super.build_phase(phase); 

     agent_ap = new (.name("agent_ap"), .parent(this)); 

     pm_seqr = pakmx_sequencer::type_id::create(.name("pm_seqr"), .parent(this)); 
     pm_drvr = pakmx_driver::type_id::create(.name("pm_drvr"), .parent(this)); 
     pm_mon = pakmx_monitor::type_id::create(.name("pm_mon"), .parent(this)); 
    endfunction: build_phase 

    //connect phase 
    function void connect_phase(uvm_phase phase); 
     super.connect_phase(phase); 

     pm_drvr.seq_item_port.connect(pm_seqr.seq_item_export); 
     pm_mon.mon_ap.connect(agent_ap); 
    endfunction: connect_phase 

答えて

0

uvm_config_db、インターフェイスを渡すための良い方法であり、それは使用がuvm_resource_db上で推奨されます。 uvm_config_dbはインスタンス名とコンテキストを使用して、どのブロックが設定値を取得するかを正確に指定できます。

//in Monitor 

    function void connect_phase (uvm_phase phase) ; 
     uvm_config_db#(virtual pakmx_if_out)::get(.cntxt (this),.inst_name(""), .field_name("pakmx_if_out"), .value(vif_out)); 
    end function 

モニタの2つのインスタンスが作成されます。モニター名が異なるので、これらの名前を使用して、これらのモニターにインターフェースの異なるインスタンスを渡します。

//build phase 
function void build_phase(uvm_phase phase); 

    super.build_phase(phase); 
    //agent_ap = new (.name("agent_ap"), .parent(this)); 


    pm_seqr = pakmx_sequencer::type_id::create(.name("pm_seqr"), .parent(this)); 
    pm_drvr = pakmx_driver::type_id::create(.name("pm_drvr"), .parent(this)); 
    pm_mon = pakmx_monitor::type_id::create(.name("pm_mon"), .parent(this)); 
    pm_mon1 = pakmx_monitor::type_id::create(.name("pm_mon1"), .parent(this)); 
endfunction: build_phase 

トップレベルTBから。

// from top 
uvm_config_db#(virtual pakmx_if_out)::set(.cntxt(null), .inst_name("*pm_mon"), .field_name("pakmx_if_out"), .value(vif_out[0])); 
uvm_config_db#(virtual pakmx_if_out)::set(.cntxt(null), .inst_name("*pm_mon1"), .field_name("pakmx_if_out"), .value(vif_out[1])); 

ここで、instance_nameはモニターの2つのインスタンスを区別するために使用されます。 "*"を使用して、モニターが取得する名前に接頭部を一致させます。完全パスも指定することもできます。この場合、config_db内のインスタンスに異なるfield_name/nameを指定する必要はありません。両方のインターフェイスが異なるFIELD_NAMEを持つことができる場合

- uvm_config_db https://www.synopsys.com/Services/Documents/hierarchical-testbench-configuration-using-uvm.pdf

別の解決策の様々なニュアンスを説明

リンク。 エージェントは、接続フェーズ中に両方のインターフェイスを取得し、モニタに割り当てることができます。

//connect phase 
function void connect_phase(uvm_phase phase); 

    super.connect_phase(phase); 

     uvm_config_db#(virtual pakmx_if_out)::get(.cntxt (null),.inst_name(""), .field_name("pakmx_if_out0"), .value(vif_out[0])); 
     uvm_config_db#(virtual pakmx_if_out)::get(.cntxt(null), .inst_name(""),.field_name("pakmx_if_out1"), .value(vif_out[1])); 
     pm_mon.vif_out = vif_out[0]; 
     pm_mon1.vif_out = vif_out[1]; 

    pm_drvr.seq_item_port.connect(pm_seqr.seq_item_export); 
    pm_mon.mon_ap.connect(agent_ap); 
end function:connect_phase 

ビルドフェーズは、モニタの2つのインスタンスをインスタンス化します。

//build phase 
function void build_phase(uvm_phase phase); super.build_phase(phase); 

    agent_ap = new (.name("agent_ap"), .parent(this)); 

    pm_seqr = pakmx_sequencer::type_id::create(.name("pm_seqr"), .parent(this)); 
    pm_drvr = pakmx_driver::type_id::create(.name("pm_drvr"), .parent(this)); 
    pm_mon = pakmx_monitor::type_id::create(.name("pm_mon"), .parent(this)); 
    pm_mon1 = pakmx_monitor::type_id::create(.name("pm_mon1"), .parent(this)); 

endfunction: build_phase 

トップレベルtbから。特定のインスタンスまたはコンテキストを指定する必要はありません。これでも、uvm_config_dbを使用してください。

uvm_config_db#(virtual pakmx_if_out)::set(.cntxt(null), .inst_name(""), .field_name("pakmx_if_out0"), .value(vif_out[0])); 
     uvm_config_db#(virtual pakmx_if_out)::set(.cntxt(null), .inst_name(""), .field_name("pakmx_if_out1"), .value(vif_out[1])); 
関連する問題