[UVM 1.1d] 3-2. UVM Components
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 3-2. UVM Components

by 긍수저 2024. 9. 26.

1. UVM 설정 메커니즘 (UVM Configuration Mechanism)

UVM에서는 검증 환경에서 **설정 메커니즘(Configuration Mechanism)**을 통해 여러 컴포넌트 간의 파라미터를 쉽게 전달하고 공유할 수 있습니다. 이는 테스트벤치의 유연성을 높이고, 다양한 검증 시나리오를 구현하는 데 도움을 줍니다. UVM에서는 uvm_config_dbuvm_resource_db라는 두 가지 주요 설정 메커니즘을 제공합니다.

uvm_config_db

uvm_config_db는 검증 환경의 트리 구조 내에서 데이터를 설정하고 검색하는 데 사용됩니다. 설정된 값은 트리 하위 계층에 있는 모든 컴포넌트에서 접근할 수 있습니다.

 

특징:

  • 설정 데이터의 계층적 전달: 상위 컴포넌트에서 설정된 값이 하위 컴포넌트로 전달됩니다.
  • 유연성: 다양한 데이터 타입을 저장하고 공유할 수 있습니다.

예시 코드:

class my_env extends uvm_env;
  ethernet_agent agent;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    uvm_config_db#(int)::set(this, "agent", "num_ports", 4);
  endfunction
endclass

class ethernet_agent extends uvm_agent;
  int num_ports;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    if(!uvm_config_db#(int)::get(this, "", "num_ports", num_ports))
      `uvm_fatal("CFG_ERR", "Number of ports not set!");
  endfunction
endclass

uvm_resource_db

uvm_resource_db는 전역적으로 공유되는 리소스를 관리합니다. 이는 여러 컴포넌트 간에 데이터를 공유할 때 유용하며, 특정 트리 구조에 구속되지 않습니다.

특징:

  • 글로벌 데이터 공유: 설정된 값이 어디서든 접근 가능합니다.
  • 리소스 우선순위 설정 가능

2. 시나리오 생성 활성화 (Enabling Scenario Creation)

UVM에서는 시퀀서와 시퀀스를 사용하여 다양한 시나리오를 생성할 수 있습니다. 사용자 정의 시퀀스를 통해 검증을 위한 맞춤형 자극(stimulus)을 제공할 수 있습니다.

시퀀스 및 시퀀스 아이템 선언

시퀀스 아이템은 트랜잭션 데이터의 추상화를 나타내며, 시퀀스는 이러한 시퀀스 아이템을 기반으로 자극을 생성합니다.

예시 코드:

class my_sequence_item extends uvm_sequence_item;
  rand bit [31:0] addr;
  rand bit [31:0] data;

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

class my_sequence extends uvm_sequence#(my_sequence_item);
  `uvm_object_utils(my_sequence)

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

  task body();
    my_sequence_item req;
    req = my_sequence_item::type_id::create("req");
    start_item(req);
    finish_item(req);
  endtask
endclass

기본 시퀀스 설정 및 오버라이드

시퀀서는 특정 시퀀스를 기본값으로 설정할 수 있으며, 필요 시 이를 오버라이드하여 다른 시퀀스로 대체할 수 있습니다.

 
class my_sequencer extends uvm_sequencer#(my_sequence_item);

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    default_sequence = my_sequence::type_id::get();
  endfunction
endclass

UVM에서 테스트가 종료될 시점을 관리하는 것은 매우 중요합니다. uvm_objection 메커니즘을 사용하여 각 컴포넌트가 테스트가 종료될 준비가 되었는지 관리할 수 있습니다.

 

특징:

  • 각 컴포넌트는 objection을 올리거나 내릴 수 있음
  • 모든 컴포넌트에서 objection이 내려지면 테스트가 종료됨

예시 코드:

class my_test extends uvm_test;

  virtual task run_phase(uvm_phase phase);
    phase.raise_objection(this);
    // 테스트 실행 로직
    phase.drop_objection(this);
  endtask
endclass

4. 체크 및 커버리지 구현 (Implementing Checks and Coverage)

검증 과정에서 체크커버리지는 매우 중요한 요소입니다. UVM에서는 클래스 내부에서 또는 인터페이스를 통해 체크 및 커버리지를 구현할 수 있습니다.

클래스 내 체크 및 커버리지 구현

클래스 내부에서 데이터를 기반으로 자가 검증을 수행하고, 커버리지 수집을 할 수 있습니다.

예시 코드:

 

class my_monitor extends uvm_monitor;
  covergroup cg;
    cg.addr : coverpoint tr.addr;
    cg.data : coverpoint tr.data;
  endgroup

  virtual function void build_phase(uvm_phase phase);
    cg = new();
  endfunction
endclass

인터페이스 기반 체크 및 커버리지

인터페이스는 하드웨어와 소프트웨어 간의 상호작용을 모니터링할 수 있는 좋은 방법입니다. 인터페이스를 통해 체크와 커버리지를 구현할 수 있습니다.

예시 코드:

 

interface my_interface;
  logic clk;
  logic [31:0] data;
  modport master(input clk, input data);
  modport slave(output clk, output data);
endinterface

5. 체크 및 커버리지 제어 (Controlling Checks and Coverage)

UVM에서는 체크와 커버리지의 활성화 또는 비활성화를 제어할 수 있습니다. 이를 통해 특정 시나리오에서 불필요한 체크나 커버리지를 제외하거나 필요한 부분에 집중할 수 있습니다.

예시 코드:

 

class my_env extends uvm_env;
  my_monitor monitor;

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    monitor = my_monitor::type_id::create("monitor", this);
    uvm_config_db#(bit)::set(this, "monitor", "enable_coverage", 1);
  endfunction
endclass

결론

UVM의 설정 메커니즘, 시나리오 생성, 테스트 종료 관리, 체크 및 커버리지 구현은 복잡한 검증 환경을 효율적으로 관리하고, 재사용 가능한 검증 구조를 구축하는 데 필수적입니다. 각 기능은 유연성과 확장성을 제공하여 다양한 검증 시나리오에 맞게 시스템을 최적화할 수 있습니다.

반응형

댓글