2016-08-09 3 views
0

인터페이스 클래스가 있습니다. 나는에 의해 가상 인터페이스를 만들 모니터에서인터페이스 인스턴스 2 개에 대해 모니터 인스턴스 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; 

을, 나는 모니터에서 작업을 상기 인터페이스의 신호에 액세스한다. 각 모니터가 인터페이스의 다른 인스턴스를 참조하도록 에이전트 클래스에서 모니터 인스턴스 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 

모니터의 두 인스턴스가 생성됩니다. 모니터 이름이 다르므로이 이름을 사용하여이 모니터에 인터페이스의 다른 인스턴스를 전달합니다.

//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은 모니터의 두 인스턴스를 구별하는 데 사용됩니다. "*"를 사용하여 모니터가 얻는 이름의 접두어를 찾습니다. 전체 경로 나 정확한 경로도 지정할 수 있습니다. 이 경우 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 

빌드 단계는 모니터의 두 인스턴스를 인스턴스화합니다.

//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]));