4장: Reusable Verification Components
UVM에서 **검증 컴포넌트(Verification Components)**는 설계 검증을 위한 중요한 요소입니다. 이 장에서는 검증 컴포넌트를 사용하는 방법, 구성하는 방법, 그리고 테스트에 맞춰 커스터마이징하는 방법을 설명합니다.
4.1 검증 컴포넌트 사용 (Using a Verification Component)
검증 컴포넌트는 트랜잭션 레벨 모델링(TLM)과 UVM 시퀀서를 사용하여 디자인을 검증하는 데 핵심적인 역할을 합니다. 컴포넌트는 Driver, Monitor, Sequencer 등의 구성 요소로 이루어져 있으며, 설계와 테스트 시나리오 간의 상호작용을 관리합니다.
특징:
- 모듈화 및 재사용 가능 구조
- 디자인의 특정 기능을 독립적으로 검증 가능
4.2 테스트벤치 클래스 (Testbench Class)
테스트벤치는 검증 컴포넌트들을 상호 연결하는 상위 수준 구조입니다. 모든 검증 컴포넌트는 테스트벤치 클래스 내에서 구성되고 실행됩니다.
특징:
- 상위 구조로 여러 컴포넌트 간의 인터페이스를 관리
- 각 검증 컴포넌트에 대한 객체 생성 및 연결
4.3 검증 컴포넌트 인스턴스화 (Instantiating Verification Components)
각 검증 컴포넌트는 테스트벤치 내에서 인스턴스화되어야 합니다. 이 과정에서 컴포넌트 간의 포트 연결을 수행합니다.
예시 코드:
class my_testbench extends uvm_env;
my_driver driver;
my_monitor monitor;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
driver = my_driver::type_id::create("driver", this);
monitor = my_monitor::type_id::create("monitor", this);
endfunction
endclass
4.4 테스트 클래스 (Test Class)
테스트 클래스는 실제 테스트 시나리오를 정의하고, 시뮬레이션을 실행하는 데 필요한 환경을 설정합니다. 이 클래스는 검증 컴포넌트와 테스트벤치를 상호 연결합니다.
4.5 검증 컴포넌트 설정 (Verification Component Configuration)
검증 컴포넌트는 다양한 설정 옵션을 제공하여, 테스트 목적에 맞게 유연하게 구성할 수 있습니다. 설정된 값은 uvm_config_db 또는 uvm_resource_db를 통해 전달됩니다.
특징:
- 설정 값은 상위 계층에서 하위 계층으로 전달됨
- 테스트 간 설정 변경이 용이함
4.6 사용자 정의 테스트 생성 (Creating and Selecting a User-Defined Test)
사용자 정의 테스트는 테스트 클래스에서 기본적으로 제공하는 시퀀스 외에, 특정 테스트 시나리오에 맞게 새로운 시퀀스를 정의할 수 있습니다.
class my_custom_test extends uvm_test;
`uvm_component_utils(my_custom_test)
function new(string name = "my_custom_test", uvm_component parent = null);
super.new(name, parent);
endfunction
virtual task run_phase(uvm_phase phase);
my_custom_sequence seq;
my_custom_sequencer seqr;
// 시퀀스 및 시퀀서 생성
seq = my_custom_sequence::type_id::create("seq");
seqr = my_custom_sequencer::type_id::create("seqr", this);
// 시퀀스를 시퀀서를 통해 실행
seqr.start(seq);
endtask
endclass
4.7 의미 있는 테스트 생성 (Creating Meaningful Tests)
의미 있는 테스트를 생성하기 위해서는 데이터 항목 제약과 특정 시나리오를 바탕으로 한 테스트 생성이 필요합니다.
4.7.1 데이터 항목 제약 (Constraining Data Items)
데이터 항목에 랜덤 제약 조건을 설정하여 다양한 상황에서의 설계 동작을 테스트할 수 있습니다. 이를 통해 보다 폭넓은 범위의 검증이 가능해집니다.
class my_sequence_item extends uvm_sequence_item;
rand bit [31:0] addr;
rand bit [31:0] data;
constraint addr_range { addr < 32'hFFFF; } // 주소 범위 제약
constraint data_valid { data != 32'h0; } // 유효 데이터 제약
function new(string name = "my_sequence_item");
super.new(name);
endfunction
endclass
4.7.2 데이터 항목 정의 (Data Item Definitions)
데이터 항목은 시퀀스 내에서 트랜잭션을 나타냅니다. 각 트랜잭션은 설계에서 주고받는 데이터의 단위를 정의하며, 이를 통해 DUT의 동작을 확인할 수 있습니다.
4.7.3 테스트 특정 프레임 생성 (Creating a Test-Specific Frame)
테스트에 맞춘 특정 프레임을 생성하는 것은 테스트 시나리오의 정확성과 효율성을 높이는 중요한 요소입니다. 각 테스트에 맞춘 설정과 시나리오를 정의하여 다양한 상황을 검증할 수 있습니다.
class my_test extends uvm_test;
`uvm_component_utils(my_test)
function new(string name = "my_test");
super.new(name);
endfunction
virtual task run_phase(uvm_phase phase);
my_sequence seq;
seq = my_sequence::type_id::create("seq");
// 트랜잭션의 주소 범위를 0x1000 ~ 0x2000으로 제한하는 제약 조건
uvm_do_with(seq, { seq.addr >= 32'h1000 && seq.addr <= 32'h2000; });
endtask
endclass
결론:
UVM의 검증 컴포넌트는 설계 검증의 핵심 요소로, 이를 효율적으로 활용하면 복잡한 테스트 시나리오에서도 높은 재사용성과 모듈화를 실현할 수 있습니다.
'지식 공유 > UVM' 카테고리의 다른 글
[UVM 1.1d] 5-2. Register Model (Register Abstraction Layer) (0) | 2024.10.15 |
---|---|
[UVM 1.1d] 5-1. Register Model (Register Abstraction Layer) (0) | 2024.10.15 |
[UVM 1.1d] 4-2. Reusable UVM Component (0) | 2024.10.10 |
[UVM 1.1d] UVM Sequence Macro (uvm_do/uvm_do_with) (0) | 2024.09.29 |
[UVM 1.1d] 3-2. UVM Components (1) | 2024.09.26 |
[UVM 1.1d] 3-1. UVM Components (1) | 2024.09.25 |
댓글