[UVM 1.1d] 4-1. Reusable UVM Component
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 4-1. Reusable UVM Component

by 긍수저 2024. 9. 29.
반응형

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의 검증 컴포넌트는 설계 검증의 핵심 요소로, 이를 효율적으로 활용하면 복잡한 테스트 시나리오에서도 높은 재사용성과 모듈화를 실현할 수 있습니다.

반응형

댓글