지노랩 /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:57

3.1 데이터 항목 모델링 (Modeling Data Items for Generation)

✅ 데이터 항목 (Data Items)이란?

데이터 항목은 DUT(Device Under Test)와 주고받는 트랜잭션 객체로, 검증 환경에서 여러 용도로 사용된다.

  • 트랜잭션을 자극(stimulus)으로 사용하여 DUT를 테스트하는 역할.
  • 검증 환경에서 트랜잭션을 처리하는 객체.
  • 사용자가 직접 정의하는 클래스 인스턴스.
  • 트랜잭션 수준 커버리지 측정 및 검증 기능 포함.

3.1.1 사용자 정의 데이터 항목 생성 방법

사용자 정의 데이터 항목을 만들기 위해 다음 단계를 따른다.

  1. DUT의 트랜잭션 사양을 분석하고, 필요한 속성, 제약조건, 함수 등을 정의.
  2. uvm_sequence_item 클래스를 상속하여 데이터 항목 클래스를 정의.
  3. 생성자(Constructor)를 구현하여 초기화 과정 추가.
  4. 테스트 설정을 쉽게 하기 위해 제어 필드("Knobs") 추가.
  5. UVM 필드 매크로(uvm_field_*)를 활용하여 자동화 지원(출력, 복사, 비교 기능).
  6. 필요한 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

✅ 코드 설명

  1. (Line 1) uvm_sequence_item을 상속하여 simple_item 클래스 정의.
  2. (Line 5~6) 주소(addr)와 데이터(data)에 대한 제약조건(constraint) 추가.
  3. (Line 8~12) uvm_object_utils_begin 매크로를 사용하여 자동화 기능 추가.
  4. (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

✅ 코드 설명

  1. simple_item을 상속받아 word_aligned_item 클래스를 생성.
  2. 추가적인 제약 조건(word_aligned_addr)을 정의하여 주소가 워드 정렬(4바이트 단위)되도록 강제.
  3. 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

✅ 코드 설명

  1. (Line 1) typedef enum을 사용하여 지연 시간의 카테고리를 정의.
  2. (Line 6) delay_kind 필드를 추가하여 지연 시간이 특정 범위 내에서만 생성되도록 제한.
  3. (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
를 바탕으로 작성된 글입니다.