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