1. UVM 설정 메커니즘 (UVM Configuration Mechanism)
UVM에서는 검증 환경에서 **설정 메커니즘(Configuration Mechanism)**을 통해 여러 컴포넌트 간의 파라미터를 쉽게 전달하고 공유할 수 있습니다. 이는 테스트벤치의 유연성을 높이고, 다양한 검증 시나리오를 구현하는 데 도움을 줍니다. UVM에서는 uvm_config_db와 uvm_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의 설정 메커니즘, 시나리오 생성, 테스트 종료 관리, 체크 및 커버리지 구현은 복잡한 검증 환경을 효율적으로 관리하고, 재사용 가능한 검증 구조를 구축하는 데 필수적입니다. 각 기능은 유연성과 확장성을 제공하여 다양한 검증 시나리오에 맞게 시스템을 최적화할 수 있습니다.
'지식 공유 > UVM' 카테고리의 다른 글
[UVM 1.1d] 4-2. Reusable UVM Component (0) | 2024.10.10 |
---|---|
[UVM 1.1d] 4-1. Reusable UVM Component (0) | 2024.09.29 |
[UVM 1.1d] UVM Sequence Macro (uvm_do/uvm_do_with) (0) | 2024.09.29 |
[UVM 1.1d] 3-1. UVM Components (1) | 2024.09.25 |
[UVM 1.1d] 2. Transaction-Level Modeling (TLM) (0) | 2024.09.23 |
[UVM 1.1d] 1. Overview (0) | 2024.09.22 |
댓글