[UVM 1.1d] 6-1. Advanced UVM Topics (Factory, Callback)
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 6-1. Advanced UVM Topics (Factory, Callback)

by 긍수저 2024. 11. 12.
반응형

6.1 UVM Factory 개요

UVM Factory는 UVM 환경에서 객체와 컴포넌트를 생성하고 관리하는 중앙 관리 시스템으로, 검증 환경에서 유연한 객체 생성재사용성을 보장합니다. 이를 통해 객체의 타입을 동적으로 설정하고, 특정 객체나 컴포넌트를 대체할 수 있는 Override 기능을 제공합니다.

UVM Factory의 주요 기능:

  1. 동적 객체 생성: 코드 내에서 객체의 타입을 고정하지 않고 필요할 때마다 원하는 타입으로 생성할 수 있습니다.
  2. Override 메커니즘: 기존 객체를 새 객체로 대체할 수 있으며, 이를 통해 테스트 환경의 구성을 유연하게 변경할 수 있습니다.
  3. 객체 재사용성: 동일한 객체를 여러 테스트에서 사용하여 코드의 중복을 줄이고, 유지 보수성을 높입니다.

객체 생성 예시

class my_component extends uvm_component;
  `uvm_component_utils(my_component) // Factory 등록

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

  virtual function void build_phase(uvm_phase phase);
    `uvm_info("FACTORY", "my_component created and registered with the Factory", UVM_LOW);
  endfunction
endclass

위 예제에서는 컴포넌트가 정의될 때, UVM 매크로 uvm_component_utils 또는 uvm_object_utils를 사용하여 Factory에 등록합니다.


6.2 UVM Factory를 사용한 객체 생성

UVM Factory는 type_id::create 메서드를 통해 객체를 생성합니다. 이 방식은 UVM에서 표준적으로 객체를 생성하는 방식으로, 동적 객체 생성Override 적용이 가능합니다.

객체 생성 예시

my_component comp;
comp = my_component::type_id::create("comp_name", this);

위 예제에서는 type_id::create 메서드를 사용해 my_component 객체를 생성했습니다. type_id::create는 UVM Factory에 등록된 객체 타입을 기반으로 객체를 생성하며, 생성된 객체는 comp 변수에 저장됩니다.


6.3 UVM Factory Override 설정

Override는 UVM Factory의 가장 강력한 기능 중 하나로, 특정 객체 타입을 다른 타입으로 대체할 수 있습니다. 이를 통해 테스트 환경의 유연성을 높이고, 다양한 테스트 시나리오에 맞게 객체 구성을 동적으로 변경할 수 있습니다.

Override 방법

Override는 type overrideinstance override로 나뉩니다:

  1. Type Override: 특정 객체 타입을 다른 타입으로 대체합니다. 이 방식은 환경 전체에서 사용되는 객체 타입을 변경할 때 유용합니다.
  2. Instance Override: 특정 인스턴스에만 Override를 적용합니다. 특정 객체에만 다른 동작을 적용하고자 할 때 사용합니다.

Type Override 예시:

set_type_override_by_type(ubus_master_driver::get_type(), ubus_new_master_driver::get_type);

위 코드에서는 my_component를 new_component로 대체했습니다. 이 설정 이후 my_component 타입으로 생성된 모든 객체는 실제로 new_component로 대체됩니다.

Instance Override 예시:

set_inst_override_by_type(“slaves[0].monitor”, ubus_slave_monitor::get_type(), ubus_new_slave_monitor::get_type());

위 코드에서는 comp_name이라는 이름으로 생성되는 my_component 객체만 new_component로 대체되었습니다. 이는 특정 객체에 대해서만 Override를 적용하고자 할 때 유용합니다.


6.4 UVM Callback Mechanism

Callback은 UVM 환경에서 검증 시나리오를 동적으로 변경하는 데 사용되는 메커니즘으로, 추가적인 동작을 정의하거나 기존 동작을 수정할 수 있는 유연성을 제공합니다. 특히 코드의 수정 없이 특정 위치에서 동작을 변경할 수 있어 유지 보수가 쉽고, 코드 재사용성을 높입니다.

Callback의 주요 기능

  1. 추가 동작 설정: 콜백 함수를 등록하여 기존 함수 호출 시 추가적인 동작을 수행할 수 있습니다.
  2. 동작 수정 및 확장: 특정 기능을 수정하거나 확장할 수 있어, 다양한 테스트 시나리오에 맞는 동작을 구현할 수 있습니다.

Callback 구현 예시

Callback 메커니즘은 보통 다음과 같은 단계로 구현됩니다:

  1. Callback 클래스를 정의하여 콜백 함수의 동작을 설정합니다.
  2. 원하는 위치에서 Callback 호출: 콜백 함수를 호출하여 특정 위치에서 동작이 실행되도록 합니다.
  3. Callback 등록: 테스트나 환경에서 원하는 Callback 객체를 등록하여, 특정 시점에서 Callback이 실행되도록 설정합니다.

Callback 클래스 정의 및 등록 예시:

class my_callback extends uvm_callback;
  `uvm_object_utils(my_callback)

  virtual function void pre_process();
    `uvm_info("CALLBACK", "Pre-process callback executed.", UVM_LOW);
  endfunction
endclass

class my_component extends uvm_component;
  `uvm_component_utils(my_component)

  uvm_callbacks#(my_callback) callbacks;

  function new(string name, uvm_component parent);
    super.new(name, parent);
    callbacks = new();
  endfunction

  virtual function void execute();
    my_callback cb;
    callbacks.pre_process();
    // 콜백 동작 수행
    `uvm_info("CALLBACK", "Executing main process", UVM_LOW);
  endfunction
endclass

Callback 사용 예시

Callback을 등록하여 실행할 수 있습니다.

my_callback cb_inst = new();
my_component comp = new("comp_name", null);

// Callback 등록
uvm_callbacks#(my_callback)::add(comp, cb_inst);

// Execute 메서드 실행 시 콜백 호출
comp.execute();

위 코드는 Callback을 사용해 execute 메서드의 특정 위치에서 pre_process 메서드를 호출하는 방법을 보여줍니다. 이를 통해 코드의 수정 없이도 원하는 시점에 추가 동작을 수행할 수 있습니다.


결론

UVM의 FactoryCallback Mechanism은 검증 환경의 유연성재사용성을 높이는 데 필수적인 요소입니다. Factory는 객체와 컴포넌트를 동적으로 생성하고, Override 메커니즘을 통해 다양한 테스트 시나리오에 맞게 구성할 수 있도록 해줍니다. 또한, Callback Mechanism은 특정 위치에서 동작을 동적으로 변경하거나 추가할 수 있는 기능을 제공하여, 코드의 수정 없이도 검증 시나리오를 효과적으로 조정할 수 있습니다.

반응형

댓글