04_UVM Utility & Field Macros 완벽 가이드: 초심자를 위한 핵심 개념 정리

UVM 유틸리티/필드 매크로 완벽 가이드: 초심자를 위한 핵심 개념 정리

UVM(Universal Verification Methodology)은 복잡한 SystemVerilog 검증 환경을 구축하는 데 필수적인 도구입니다. 특히, UVM 유틸리티 및 필드 매크로는 객체 등록, 자동화된 출력, 복사, 비교 기능을 제공하여 효율적인 검증 환경 구축을 돕습니다. 이 글에서는 Verilog/SystemVerilog 경험을 바탕으로 UVM 초심자를 위해 유틸리티 및 필드 매크로의 핵심 개념과 활용 방법을 자세히 설명합니다. UVM Factory를 활용한 객체 생성부터 필드 매크로를 이용한 자동화까지, UVM 검증 환경 구축에 필요한 모든 것을 담았습니다. UVM의 기본 개념을 이해하고, 실제 검증 환경에서 매크로를 효과적으로 활용하여 검증 효율성을 높이세요.

UVM 유틸리티 매크로 (Utility Macros)

UVM 유틸리티 매크로는 객체 또는 컴포넌트를 UVM Factory에 등록하는 데 사용됩니다. 이는 UVM이 필요한 유형의 객체를 요청 시 반환할 수 있도록 합니다. 특히, `uvm_object_utils`uvm_component_utils 매크로는 각각 uvm_objectuvm_component에서 파생된 클래스를 등록하는 데 필수적입니다.

객체 유틸리티 (Object Utility)

uvm_object 또는 uvm_transaction에서 직접 파생된 모든 클래스는 `uvm_object_utils 매크로를 사용하여 등록해야 합니다. 각 클래스에 대해 new 함수를 명시적으로 정의하고, 클래스 인스턴스 이름을 인수로 전달해야 합니다.


class ABC extends uvm_object;

  // Register this user defined class with the factory
  `uvm_object_utils(ABC)

  function new(string name = "ABC");
    super.new(name);
  endfunction
endclass

컴포넌트 유틸리티 (Component Utility)

uvm_component에서 직간접적으로 파생된 모든 클래스는 `uvm_component_utils 매크로를 사용하여 등록해야 합니다. new 함수는 클래스 인스턴스 이름과 부모 클래스 핸들을 인수로 사용합니다.


class DEF extends uvm_component;

  // Class derived from uvm_component, register with factory
  `uvm_component_utils(DEF)

  function new(string name = "DEF", uvm_component parent=null);
    super.new(name, parent);
  endfunction
endclass

매크로 확장: 내부 작동 원리 (Macro Expansion: Behind the Scenes)

`uvm_object_utils 매크로는 내부적으로 `uvm_object_utils_begin`uvm_object_utils_end로 확장됩니다. `uvm_object_utils_begin은 UVM Factory의 올바른 작동에 필요한 다른 매크로를 구현합니다.


// Empty uvm_object_utils macro
`define uvm_object_utils(T)
  `uvm_object_utils_begin(T)
  `uvm_object_utils_end

`define uvm_object_utils_begin(T)
   `m_uvm_object_registry_internal(T,T)     // Sub-macro #1
   `m_uvm_object_create_func(T)  			 // Sub-macro #2
   `m_uvm_get_type_name_func(T)  			 // Sub-macro #3
   `uvm_field_utils_begin(T)				 // Sub-macro #4

// uvm_object_utils_end simply terminates a function started
// somewhere in the middle
`define uvm_object_utils_end
     end
   endfunction

각 확장된 매크로는 Factory 작동에 필요한 함수를 구현하고 다음 단계를 수행합니다.

  • get_type 정적 메서드를 구현하여 요청된 type에 대한 Factory 프록시 객체를 반환합니다.
  • 인수 없이 생성자를 호출하여 지정된 type의 객체를 인스턴스화하는 create를 구현합니다.
  • type을 문자열로 반환하는 get_type_name 메서드를 구현합니다.
  • UVM Factory에 type을 등록합니다.

클래스 객체 생성 (Creation of class object)

모든 클래스 객체는 `m_uvm_object_create_func 매크로를 사용하여 정의된 type_id::create() 메서드를 호출하여 생성하는 것이 좋습니다. 이를 통해 Factory 메커니즘을 사용하여 모든 하위 클래스 객체를 생성하고 반환하여 테스트벤치 유연성 및 재사용성을 향상시킬 수 있습니다.


class ABC extends uvm_object;
  `uvm_object_utils(ABC)

  function new(string name = "ABC");
    super.new(name);
  endfunction
endclass

class base_test extends uvm_test;
  `uvm_component_utils(base_test)

  function new(string name = "base_test", uvm_component parent=null);
    super.new(name, parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);

    // An object of class "ABC" is instantiated in UVM by calling
    // its "create()" function which has been defined using a macro
    // as shown above
    ABC abc = ABC::type_id::create("abc_inst");
  endfunction
endclass

UVM 필드 매크로 (Field Macros)

`uvm_field_* 매크로는 클래스 속성에 작동하며 복사, 비교 및 출력과 같은 핵심 메서드의 자동 구현을 제공합니다. 이는 각 클래스에 대해 사용자 정의 do_copy, do_comparedo_print 함수를 구현하는 데 소요되는 시간을 절약하는 데 도움이 됩니다. 하지만 이러한 매크로는 일반 코드로 확장되므로 시뮬레이션 성능에 영향을 줄 수 있으며 일반적으로 권장되지 않습니다.

사용 예시 (Usage Example)


class ABC extends uvm_object;
  rand bit [15:0] 	m_addr;
  rand bit [15:0] 	m_data;

  `uvm_object_utils_begin(ABC)
    `uvm_field_int(m_addr, UVM_DEFAULT)
    `uvm_field_int(m_data, UVM_DEFAULT)
  `uvm_object_utils_end

  function new(string name = "ABC");
    super.new(name);
  endfunction
endclass

각 변수의 데이터 유형에 해당하는 `uvm_field_*를 사용해야 합니다. 예를 들어, int, bit, byte 유형의 변수는 `uvm_field_int를 사용하고, string 유형의 변수는 `uvm_field_string을 사용해야 합니다. 매크로는 최소 두 개의 인수(ARGFLAG)를 허용합니다.

ARG: 변수 이름, 해당 유형은 사용되는 매크로에 적합해야 합니다.
FLAG: UVM_DEFAULT 또는 UVM_ALL_ON 이외의 값으로 설정하면 포함되지 않을 데이터 메서드 구현을 지정합니다. 예를 들어, FLAGNO_COPY로 설정되면 복사를 제외한 모든 항목이 변수에 대해 구현됩니다.

필드 FLAG는 다음 값을 사용할 수 있으며 여러 값을 OR로 결합할 수 있습니다. 이러한 플래그의 조합은 지정된 변수에 대해 수행할 수 있는 작업 유형을 결정합니다.

  • UVM_ALL_ON: 모든 작업이 켜집니다.
  • UVM_DEFAULT: 모든 작업을 활성화하며 UVM_ALL_ON과 동일합니다.
  • UVM_NOCOPY: 지정된 변수를 복사하지 않습니다.
  • UVM_NOCOMPARE: 지정된 변수를 비교하지 않습니다.
  • UVM_NOPRINT: 지정된 변수를 출력하지 않습니다.
  • UVM_NOPACK: 지정된 변수를 패킹 또는 언패킹하지 않습니다.
  • UVM_REFERENCE: 핸들에서만 작동합니다. 즉, 객체 유형의 경우 깊은 복사를 수행하지 않습니다.

작업 제어와 함께 `uvm_field_* 매크로는 지정된 변수의 기수에 대한 일부 제어를 제공합니다. 이 값은 위의 표에 나열된 작동 플래그와 OR로 결합될 수 있습니다. UVM_HEX는 지정되지 않은 경우 기본 기수입니다.

  • UVM_BIN: 지정된 변수를 이진 형식으로 출력/기록합니다.
  • UVM_DEC: 지정된 변수를 십진 형식으로 출력/기록합니다.
  • UVM_HEX: 지정된 변수를 16진 형식으로 출력/기록합니다.
  • UVM_OCT: 지정된 변수를 8진 형식으로 출력/기록합니다.
  • UVM_STRING: 지정된 변수를 문자열 형식으로 출력/기록합니다.
  • UVM_TIME: 지정된 변수를 시간 형식으로 출력/기록합니다.

필드 매크로의 더 많은 예는 print, copy, comparepack에서 확인할 수 있습니다.

다음 이전

POST ADS 2