2016-11-30 16 views
0

테스트 환경에서 사용할 수있는 일반적인 작업과 기능이 포함 된 패키지를 작성하려고합니다. 예를 들어 ,패키지에서 가상 인터페이스를 한 번만 가져옵니다.

package test_misc_pkg; 
`include "uvm_macros.svh" 
import uvm_pkg::*; 

task wait_rest(); 
    virtual test_if test_vif; 
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif)) 
    `uvm_fatal("NOVIF", "virtual interface should be set") 

    @(posedge test_vif.clk); 
    //do something... 
endtask 

endpackage : test_misc_pkg 

그런 다음, 테스트 ENV는 wait_rest() 후 수입 test_misc_pkg를 호출 할 수 있습니다.

하지만 다른 작업에서 동일한 test_vif를 사용하는 경우 모든 작업을 시작할 때 db를 가져와야합니다. 제 질문은 패키지에서 uvm_config_db를 한 번만 가져올 수 있습니다. 모든 작업에서 test_vif를 직접 사용할 수 있습니까?

아니면 더 좋은 방법이 있을까요?

감사합니다. 글로벌 가상 인터페이스에게 가치를 제공하기 위해 (예를 들어 set_vif())

package test_misc_pkg; 
    `include "uvm_macros.svh" 
    import uvm_pkg::*; 

    virtual test_if test_vif; 

    function void set_vif(); 
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif)) 
     `uvm_fatal("NOVIF", "virtual interface should be set") 
    endfunction 

    task wait_rest(); 
    @(posedge test_vif.clk); 
    //do something... 
    endtask 

endpackage : test_misc_pkg 

와는 함수를 작성 :

답변

0

uvm_config_db::get()을 호출하는 오버 헤드를 줄이려면 null인지 확인한 다음 get을 수행하십시오.

task wait_rest(); 
    virtual test_if test_vif; // this is a static variable 
    if (test_vif == null) begin 
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif)) 
    `uvm_fatal("NOVIF", "virtual interface should be set") 
end 
    @(posedge test_vif.clk); 
    //do something... 
endtask 
+0

예, 불필요한 uvm_config_db :: get()을 줄이고 코드를 깨끗하게 유지하려고합니다. 어쩌면 변수를 검사하기위한 하위 작업을 작성할 수도 있고, 사용하기 전에 모든 작업에 넣을 수도 있습니다. 귀하의 의견에 감사드립니다. – DexterH

1

당신은 가상 인터페이스를 글로벌 변수를 만들 수 있습니다. 그런 다음 connect_phase에서이 함수를 호출 할 수 있습니다. 그래도 모두 조금 비 재래 한 것처럼 보입니다.

+0

이 방법은 마음에 들지 않지만이 방법이 마음에 듭니다. – noobuntu

+0

시도해보아야합니다. 감사. 그건 그렇고, 일반 작업 패키지에 대한 일반적인 또는 정상적인 방법은 무엇입니까? – DexterH