지노랩 /JinoLab

[UVM] 3.10.4 시퀀스 아이템 및 시퀀스 오버라이딩 (Overriding Sequence Items and Sequences) 본문

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

[UVM] 3.10.4 시퀀스 아이템 및 시퀀스 오버라이딩 (Overriding Sequence Items and Sequences)

지노랩/JinoLab 2025. 3. 20. 12:00

 

1. 개요

  • UVM에서는 기존 시퀀스(sequence)나 시퀀스 아이템(sequence item)의 동작을 변경하기 위해 "오버라이딩(Overriding)"을 지원.
  • 오버라이딩을 통해 기존 시퀀스를 수정하지 않고도 특정 테스트 환경에서 변경된 동작을 적용할 수 있음.
  • UVM 팩토리(factory)를 활용하여 특정 타입의 시퀀스 또는 시퀀스 아이템을 다른 클래스로 대체 가능.

2. 오버라이딩을 위한 절차

(1) 사용자 정의 시퀀스 아이템 또는 시퀀스 클래스 선언

  • 새로운 동작을 추가하거나 기존의 동작을 수정하기 위해 기존 클래스에서 파생된 새로운 클래스를 정의.
  • 예제: 기본 시퀀스 아이템 simple_item을 확장하여 word_aligned_item을 선언.

예제: simple_item을 상속받은 word_aligned_item 정의

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_object_utils(simple_item)

  function new(string name = "simple_item");
    super.new(name);
  endfunction
endclass

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
endclass

설명

  • word_aligned_item 클래스는 simple_item을 확장하여 워드 정렬된 주소 제약 조건을 추가.
  • uvm_object_utils 매크로를 추가하여 UVM 팩토리에 등록.

(2) uvm_factory를 활용한 오버라이딩 적용

  • 특정 타입의 모든 인스턴스를 다른 클래스로 대체할 수 있음.
  • set_type_override_by_type() 또는 set_inst_override_by_type()을 사용하여 오버라이딩 설정.

예제: 모든 simple_item을 word_aligned_item으로 변경

set_type_override_by_type(simple_item::get_type(),
                          word_aligned_item::get_type());

설명

  • simple_item을 생성하는 모든 팩토리 요청을 word_aligned_item으로 변경.

예제: 특정 시퀀서(sequencer)에서만 simple_item을 word_aligned_item으로 변경

set_inst_override_by_type("env0.agent0.sequencer.*",
                           simple_item::get_type(),
                           word_aligned_item::get_type());

설명

  • "env0.agent0.sequencer.*" 경로에 있는 시퀀서에서만 simple_item을 word_aligned_item으로 대체.

예제: 특정 환경(env) 내 모든 시퀀서에서 simple_item을 word_aligned_item으로 변경

set_inst_override_by_type("env0.*.sequencer.*",
                          simple_item::get_type(),
                          word_aligned_item::get_type());

설명

  • "env0.*.sequencer.*" 경로에 있는 모든 시퀀서에서 simple_item을 word_aligned_item으로 대체.

(3) 오버라이딩이 적용된 아이템을 create()로 생성

  • 팩토리에서 create() 메서드를 사용하면 오버라이딩이 자동으로 반영됨.

예제: 팩토리를 활용한 시퀀스 아이템 생성

simple_item req;
req = simple_item::type_id::create("req", get_full_name());

설명

  • create()를 호출하면, 기존 simple_item이 아니라 오버라이딩된 word_aligned_item이 생성됨.

3. 요약

  • UVM에서는 팩토리를 이용하여 특정 시퀀스 아이템 또는 시퀀스를 오버라이딩할 수 있음.
  • 팩토리 설정을 통해 특정 타입을 전체적으로 변경하거나, 특정 인스턴스에서만 변경 가능.
  • 팩토리를 사용하여 생성(create())하면 오버라이딩이 적용됨.
  • 이를 통해 기존 코드를 수정하지 않고도 테스트 환경에 맞게 동작을 변경할 수 있음.

 

 

 


 

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