2014-02-25 4 views
1

나는 공장으로 UVM 테스트를 등록에 사용되는 다음의 SystemVerilog 구조와 혼란 스러워요 : 여기의 SystemVerilog : 공장과 UVM 테스트를 등록

class random_test extends uvm_test; 
    `uvm_component_utils(random_test); 
    ... 
    function new (... 

우리가 클래스 random_test의 정의를 가지고 있고, 내부 정의는 메소드를 호출하는 반면 인수는 정의되는 클래스입니다. 그래서 여기 내 질문은 :

  1. `uvm_component_utils는 어떤 객체가 random_test 클래스에서 건설되었습니다도 전에 시간이 0에 호출되고 있습니까?
  2. 클래스 정의에 `uvm_component_utils 클래스를 전달하려면 어떻게해야합니까?

감사합니다.

답변

4

`uvm_component_utils은 방법이 아니므로 컴파일 타임에 평가되는 매크로입니다.

UVM 소스 코드에서 매크로가하는 것을 볼 수 있습니다. UVM 분포 내에서 src/macros/uvm_object_defines.svh을 살펴보십시오. 클래스 random_test에 대한

귀하의 예는 이런 식으로 확장됩니다 : 나는 UVM을 공부하고 몇 가지 검사를 구축했다

typedef uvm_component_registry #(random_test,"random_test") type_id; 
static function type_id get_type(); 
    return type_id::get(); 
endfunction 
virtual function uvm_object_wrapper get_object_type(); 
    return type_id::get(); 
endfunction const static string type_name = "random_test"; 
virtual function string get_type_name(); 
    return type_name; 
endfunction 
0

하면 같은 오류가 발생했다. 몇 시간 후에 내가 당신의 코드 인 세부 사항을 찾아 낸다.

에 :

class random_test extends uvm_test; 
`uvm_component_utils(random_test); 
... 
function new (... 

우리는 uvm_component_utils`이후에 세미콜론이 필요하지 않습니다 (random_test)

그래서, 올바른 코드는 다음과 같습니다

class random_test extends uvm_test; 
`uvm_component_utils(random_test) 
... 
function new (... 

안부