지노랩 /JinoLab
[UVM] 3.1 데이터 항목 모델링 (Modeling Data Items for Generation) 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.1 데이터 항목 모델링 (Modeling Data Items for Generation)
지노랩/JinoLab 2025. 3. 10. 12:573.1 데이터 항목 모델링 (Modeling Data Items for Generation)
✅ 데이터 항목 (Data Items)이란?
데이터 항목은 DUT(Device Under Test)와 주고받는 트랜잭션 객체로, 검증 환경에서 여러 용도로 사용된다.
- 트랜잭션을 자극(stimulus)으로 사용하여 DUT를 테스트하는 역할.
- 검증 환경에서 트랜잭션을 처리하는 객체.
- 사용자가 직접 정의하는 클래스 인스턴스.
- 트랜잭션 수준 커버리지 측정 및 검증 기능 포함.
3.1.1 사용자 정의 데이터 항목 생성 방법
사용자 정의 데이터 항목을 만들기 위해 다음 단계를 따른다.
- DUT의 트랜잭션 사양을 분석하고, 필요한 속성, 제약조건, 함수 등을 정의.
- uvm_sequence_item 클래스를 상속하여 데이터 항목 클래스를 정의.
- 생성자(Constructor)를 구현하여 초기화 과정 추가.
- 테스트 설정을 쉽게 하기 위해 제어 필드("Knobs") 추가.
- UVM 필드 매크로(uvm_field_*)를 활용하여 자동화 지원(출력, 복사, 비교 기능).
- 필요한 do_* 함수 정의(객체 생성, 비교, 출력, 직렬화/역직렬화 등).
✅ UVM이 제공하는 자동화 기능
- print() : 데이터 항목을 출력.
- copy() : 데이터 항목을 복사.
- compare() : 두 개의 객체를 비교.
3.1.2 uvm_sequence_item을 사용한 데이터 항목 예제
아래 예제는 simple_item 클래스를 정의한 것으로, 주소(addr), 데이터(data), 지연(delay) 필드를 포함한다.
class simple_item extends uvm_sequence_item;
rand int unsigned addr;
rand int unsigned data;
rand int unsigned delay;
constraint c1 { addr < 16'h2000; }
constraint c2 { data < 16'h1000; }
// UVM 자동화 매크로
`uvm_object_utils_begin(simple_item)
`uvm_field_int(addr, UVM_ALL_ON)
`uvm_field_int(data, UVM_ALL_ON)
`uvm_field_int(delay, UVM_ALL_ON)
`uvm_object_utils_end
// 생성자
function new (string name = "simple_item");
super.new(name);
endfunction : new
endclass : simple_item
✅ 코드 설명
- (Line 1) uvm_sequence_item을 상속하여 simple_item 클래스 정의.
- (Line 5~6) 주소(addr)와 데이터(data)에 대한 제약조건(constraint) 추가.
- (Line 8~12) uvm_object_utils_begin 매크로를 사용하여 자동화 기능 추가.
- (Line 14~16) 생성자를 정의하여 객체를 초기화.
3.1.3 상속과 제약 조건 계층화 (Inheritance and Constraint Layering)
검증 목표를 충족하기 위해 데이터 항목을 확장하여 추가적인 제약을 적용할 수 있다.
SystemVerilog에서는 상속(Inheritance)을 사용하여 제약 조건을 확장하는 방식을 활용한다.
✅ 예제: 단어 정렬(Word-Aligned)된 데이터 항목
class word_aligned_item extends simple_item;
constraint word_aligned_addr { addr[1:0] == 2'b00; }
`uvm_object_utils(word_aligned_item)
// 생성자
function new (string name = "word_aligned_item");
super.new(name);
endfunction : new
endclass : word_aligned_item
✅ 코드 설명
- simple_item을 상속받아 word_aligned_item 클래스를 생성.
- 추가적인 제약 조건(word_aligned_addr)을 정의하여 주소가 워드 정렬(4바이트 단위)되도록 강제.
- uvm_object_utils 매크로를 사용하여 자동화 기능을 유지.
✅ 제약 조건 계층화의 장점
- 기본 클래스는 공통 기능을 제공하고, 필요에 따라 추가적인 제약을 적용 가능.
- 기존 제약을 쉽게 재사용할 수 있으며, 특정 테스트 환경에 맞게 제약 조건을 조정 가능.
- protected 또는 local 키워드를 활용하여 일부 변수의 접근을 제한 가능.
3.1.4 제어 필드(“Knobs”) 정의
검증 환경에서는 모든 가능한 입력 값을 무작위로 생성하는 것이 비효율적이므로,
테스트에서 특정 값 범위나 카테고리를 생성할 수 있도록 제어 필드(Knobs)를 정의한다.
✅ 제어 필드를 추가한 simple_item 클래스
typedef enum {ZERO, SHORT, MEDIUM, LARGE, MAX} simple_item_delay_e;
class simple_item extends uvm_sequence_item;
rand int unsigned addr;
rand int unsigned data;
rand int unsigned delay;
rand simple_item_delay_e delay_kind; // 제어 필드 추가
// UVM 자동화 매크로
`uvm_object_utils_begin(simple_item)
`uvm_field_int(addr, UVM_ALL_ON)
`uvm_field_enum(simple_item_delay_e, delay_kind, UVM_ALL_ON)
`uvm_object_utils_end
// 지연 시간 제약 조건 정의
constraint delay_order_c { solve delay_kind before delay; }
constraint delay_c {
(delay_kind == ZERO) -> delay == 0;
(delay_kind == SHORT) -> delay inside { [1:10] };
(delay_kind == MEDIUM) -> delay inside { [11:99] };
(delay_kind == LARGE) -> delay inside { [100:999] };
(delay_kind == MAX ) -> delay == 1000;
delay >=0; delay <= 1000;
}
endclass : simple_item
✅ 코드 설명
- (Line 1) typedef enum을 사용하여 지연 시간의 카테고리를 정의.
- (Line 6) delay_kind 필드를 추가하여 지연 시간이 특정 범위 내에서만 생성되도록 제한.
- (Line 12~20) delay_c 제약 조건을 사용하여 각 delay_kind 값에 따라 delay 범위를 설정.
✅ 제어 필드를 활용한 테스트 예제
constraint delay_kind_d {
delay_kind dist {ZERO:=2, SHORT:=1, MEDIUM:=1, LONG:=1, MAX:=2};
}
- delay_kind의 분포를 설정하여 특정 값이 더 자주 생성되도록 조정 가능.
- 예를 들어, ZERO(2배), MAX(2배)로 설정하여 특정 지연 시간 값이 더 많이 생성되도록 유도.
✅ 3.1 요약
- UVM에서는 uvm_sequence_item을 상속받아 트랜잭션 객체를 생성.
- 트랜잭션 데이터에는 제약 조건을 추가하여 DUT의 사양을 반영.
- 상속(Inheritance)을 사용하여 기본 클래스에서 추가적인 제약을 적용 가능.
- 테스트 설정을 쉽게 하기 위해 제어 필드(Knobs)를 정의하여 특정 데이터 패턴을 생성 가능.
- uvm_field_* 매크로를 사용하여 객체의 출력, 복사, 비교 등의 기능을 자동으로 구현.
다음 장에서는 이렇게 정의된 데이터 항목을 활용하여 트랜잭션 레벨 컴포넌트(TLM)를 구성하는 방법을 설명한다.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.5 드라이버와 시퀀서 연결 (0) | 2025.03.12 |
|---|---|
| [UVM] 3.4 시퀀서(Sequencer) 생성 (0) | 2025.03.11 |
| [UVM] 3.3 드라이버(Driver) 생성 (0) | 2025.03.11 |
| [UVM] 3.2 트랜잭션 레벨 컴포넌트 (Transaction-Level Components) (0) | 2025.03.10 |
| [UVM] 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusable Verification Components) (0) | 2025.03.09 |