06_UVM Object Copy/Clone : 자동화 매크로 활용, 객체 관리 효율 높이기

UVM 자동화 매크로 활용: print, copy, clone으로 객체 관리 효율 높이기
UVM_info

UVM 자동화 매크로 활용: print, copy, clone으로 객체 관리 효율 높이기

UVM (Universal Verification Methodology) 환경에서 uvm_object는 모든 UVM 관련 클래스의 기본 클래스입니다. 이 기본 클래스는 print, copy, compare와 같은 다양한 공통 함수들을 제공하며, UVM 자동화 매크로를 클래스 정의 내에서 사용하면 이러한 기능을 별도의 구현 없이 바로 활용할 수 있습니다. 이 글에서는 UVM 자동화 매크로를 사용하여 객체의 정보를 출력하고 복사하는 방법에 대해 자세히 알아보겠습니다. Verilog 또는 SystemVerilog에 대한 기본적인 이해가 있다면 UVM의 강력한 기능을 쉽게 익힐 수 있습니다.

UVM 자동화 매크로란 무엇일까요?

UVM 자동화 매크로는 클래스 내에서 특정 필드들을 UVM 프레임워크에 등록하고, 등록된 필드들에 대해 자동으로 print, copy 등의 표준 동작을 수행할 수 있도록 지원하는 편리한 기능입니다. 이러한 매크로를 사용하면 개발자는 객체의 각 멤버 변수에 대한 출력 또는 복사 로직을 직접 구현할 필요가 없어 코드의 양을 줄이고 유지보수성을 높일 수 있습니다.

자동화 매크로 사용 예시

다음 예제 코드를 통해 UVM 자동화 매크로의 사용법을 살펴보겠습니다.

typedef enum {FALSE, TRUE} e_bool;
class Packet extends uvm_object;
  rand bit[15:0] 	m_addr;

  // Automation macros
  `uvm_object_utils_begin(Packet)
  	`uvm_field_int(m_addr, UVM_DEFAULT)
  `uvm_object_utils_end

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

class Object extends uvm_object;
  rand e_bool 				m_bool;
  rand bit[3:0] 			m_mode;
  rand byte 				m_data[4];
  rand shortint 			m_queue[$];
  string 					m_name;
  rand Packet 				m_pkt;

  constraint c_queue { m_queue.size() == 3; }

  function new(string name = "Object");
    super.new(name);
    m_name = name;
    m_pkt = Packet::type_id::create("m_pkt");
    m_pkt.randomize();
  endfunction

  `uvm_object_utils_begin(Object)
  	`uvm_field_enum(e_bool, m_bool, UVM_DEFAULT)
  	`uvm_field_int (m_mode, 		UVM_DEFAULT)
  	`uvm_field_sarray_int(m_data, 	UVM_DEFAULT)
  	`uvm_field_queue_int(m_queue, 	UVM_DEFAULT)
  	`uvm_field_string(m_name, 		UVM_DEFAULT)
  	`uvm_field_object(m_pkt, 		UVM_DEFAULT)
  `uvm_object_utils_end
endclass

위 코드에서 Packet 클래스와 Object 클래스는 `uvm_object_utils_begin`uvm_object_utils_end 매크로 사이에 필드들을 등록하고 있습니다. 예를 들어, Packet 클래스의 m_addr 필드는 `uvm_field_int 매크로를 사용하여 등록되었으며, Object 클래스의 다양한 타입의 필드들 (m_bool, m_mode, m_data, m_queue, m_name, m_pkt) 또한 각 타입에 맞는 `uvm_field_... 매크로를 통해 등록되었습니다. UVM_DEFAULT 설정은 해당 필드가 특별히 제외되지 않는 한 모든 자동화된 메소드 (예: copy, print 등)에 포함됨을 의미합니다.

copy 메소드 활용

이제 등록된 필드들을 이용하여 객체를 복사하는 예시를 살펴보겠습니다.

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

  function void build_phase(uvm_phase phase);
    Object obj1 = Object::type_id::create("obj1");
    Object obj2 = Object::type_id::create("obj2");
    obj1.randomize();
    obj1.print();
    obj2.randomize();
   	obj2.print();

    obj2.copy(obj1);
    `uvm_info("TEST", "After copy", UVM_LOW)
    obj2.print();
  endfunction
endclass

module tb;
	initial begin
		run_test("base_test");
	end
endmodule

위의 base_test 클래스에서 두 개의 Object 타입 객체 (obj1, obj2)를 생성하고 각각 randomize() 메소드를 호출하여 랜덤한 값을 할당합니다. 그 후, obj1.print()obj2.print()를 통해 각 객체의 필드 값을 출력합니다. 핵심은 obj2.copy(obj1) 라인입니다. 이 한 줄의 코드를 통해 obj1의 모든 필드 값이 obj2로 복사됩니다. 이는 앞서 UVM 자동화 매크로를 통해 각 필드가 UVM 프레임워크에 등록되었기 때문에 가능한 것입니다. 마지막으로 복사 후 obj2의 내용을 다시 출력하여 복사가 성공적으로 이루어졌음을 확인합니다.

제공된 텍스트에서는 복사 전후의 객체 상태를 테이블 형태로 보여주고 있습니다. 첫 번째 테이블은 obj1의 랜덤화된 값, 두 번째 테이블은 obj2의 랜덤화된 값, 그리고 세 번째 테이블은 copy 메소드 호출 후 obj2의 값을 나타냅니다. 이를 통해 자동화 매크로가 copy 기능을 얼마나 간편하게 만들어주는지 확인할 수 있습니다.

결론

UVM 자동화 매크로는 print, copy와 같은 기본적인 객체 관리 기능을 손쉽게 구현할 수 있도록 도와줍니다. 특히 SystemVerilog와 UVM을 처음 접하는 엔지니어에게는 코드의 복잡성을 줄이고 UVM의 강력한 기능을 빠르게 이해하고 활용할 수 있는 좋은 방법입니다. 앞으로 UVM 환경에서 객체 관리가 필요할 때 UVM 자동화 매크로를 적극적으로 활용하여 효율적인 검증 환경을 구축해 보시기 바랍니다.

다음 이전

POST ADS 2