지노랩 /JinoLab

[UVM] 3.7 컴포넌트 인스턴스화 (Instantiating Components) 본문

UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl

[UVM] 3.7 컴포넌트 인스턴스화 (Instantiating Components)

지노랩/JinoLab 2025. 3. 15. 13:52

3.7 컴포넌트 인스턴스화 (Instantiating Components)

3.7.1 개요

UVM에서 컴포넌트를 인스턴스화하는 방식은 객체 지향(Object-Oriented) 프로그래밍 원칙과 TLM 인터페이스를 활용하여 재사용성을 극대화하는 데 중점을 둠.

  • 각 컴포넌트는 독립적으로 존재하며 다른 컴포넌트와의 연결(connect())을 변경하지 않고 교체 가능.
  • 이를 위해 UVM Factory(팩토리) 메커니즘을 사용하여 동적으로 컴포넌트를 생성.
  • 팩토리를 활용하면 새로운 서브클래스를 기존 환경에서 쉽게 적용 가능.

3.7.2 기존 방식: 일반적인 생성자 호출

일반적으로 클래스의 객체를 생성할 때는 new 생성자를 직접 호출함.

class my_component extends uvm_component;
    my_driver driver;  // 드라이버 인스턴스 선언

    virtual function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        driver = new("driver", this); // 일반적인 생성자 호출
    endfunction
endclass

문제점

  • new()를 직접 호출하면 해당 클래스를 상속받아 새로운 기능을 추가하더라도 기존 코드에서 변경이 필요함.
  • 따라서, 기존의 my_driver를 확장한 new_driver를 적용하려면 부모 클래스의 build_phase() 코드를 수정해야 함.

3.7.3 UVM Factory 활용: create() 메서드를 이용한 객체 생성

UVM에서는 컴포넌트 인스턴스화를 팩토리 메서드인 create()를 이용하여 수행.

class my_component extends uvm_component;
    my_driver driver;  // 드라이버 인스턴스 선언

    virtual function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        driver = my_driver::type_id::create("driver", this); // UVM Factory를 이용한 객체 생성
    endfunction
endclass

팩토리를 활용한 장점

  • type_id::create() 메서드는 UVM Factory를 사용하여 객체를 생성함.
  • create() 메서드는 기본적으로 my_driver 객체를 반환하지만, UVM Factory를 통해 새로운 클래스(예: new_driver)로 대체 가능.
  • 부모 클래스(my_component)를 수정하지 않고도, 다른 클래스(예: new_driver)를 반환할 수 있음.

3.7.4 드라이버 변경하기 (서브클래스 활용)

특정 테스트에서 기존의 my_driver 대신 new_driver를 사용하려면 다음과 같은 과정이 필요함.

(1) 기존 드라이버를 상속하여 새로운 드라이버 생성

class new_driver extends my_driver;
    // 새로운 기능 추가
    ...
endclass: new_driver

(2) 테스트 환경에서 팩토리를 이용하여 new_driver로 변경

virtual function void build_phase(uvm_phase phase);
    set_type_override_by_type(my_driver::get_type(), new_driver::get_type()); // 기존 타입을 새로운 타입으로 변경
    super.build_phase(phase);
endfunction

(3) 특정 인스턴스만 변경하는 경우

  • 특정 인스턴스만 new_driver로 변경하고 싶다면 set_type_override_by_inst() 메서드를 사용할 수도 있음.
set_inst_override_by_type("driver", my_driver::get_type(), new_driver::get_type());

3.7.5 정리

방법  설명
new() 사용 기존 방식으로 직접 객체를 생성하지만, 확장성이 부족함
create() 사용 UVM Factory를 활용하여 유연한 인스턴스 생성 가능
set_type_override_by_type() 특정 타입을 새로운 타입으로 변경 (모든 인스턴스에 적용)
set_inst_override_by_type() 특정 인스턴스만 새로운 타입으로 변경

UVM Factory를 활용하면, 부모 클래스를 수정하지 않고도 새로운 기능을 갖춘 서브클래스를 쉽게 적용할 수 있음.

 

 

 

 


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.