지노랩 /JinoLab
[UVM] 3.7 컴포넌트 인스턴스화 (Instantiating Components) 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.7 컴포넌트 인스턴스화 (Instantiating Components)
지노랩/JinoLab 2025. 3. 15. 13:523.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
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.8.1 에이전트의 동작 모드 (Operating Modes) (0) | 2025.03.16 |
|---|---|
| [UVM] 3.8 에이전트(Agent) 생성 (0) | 2025.03.16 |
| [UVM] 3.6 모니터(Monitor) 생성 (0) | 2025.03.15 |
| [UVM] 3.5.5 TLM 기반 드라이버 사용 (Using TLM-Based Drivers) (0) | 2025.03.14 |
| [UVM] 3.5.4 처리된 데이터 시퀀서로 반환하기 (Sending Processed Data back to the Sequencer) (0) | 2025.03.14 |