3-1장: 재사용 가능한 검증 Component 개발
UVM(Universal Verification Methodology)에서는 재사용 가능한 검증 Component를 효율적으로 개발하는 것이 중요합니다. 각 컴포넌트는 데이터 항목(Transaction), 드라이버(Driver), 시퀀서(Sequencer), 모니터(Monitor), 에이전트(Agent), 환경(Environment) 등의 요소로 구성되어 있습니다. 이들은 각각 고유한 역할과 목적을 가지며, 통합하여 강력한 검증 환경을 제공합니다.
1. 데이터 항목 (Transaction)
목적: 데이터 항목은 설계 검증에서 DUT(Device Under Test)로 전달되는 정보를 표현하는 객체입니다. 트랜잭션은 네트워크 패킷, 버스 트랜잭션, 명령어 등으로 구성될 수 있습니다. 트랜잭션 클래스는 UVM에서 랜덤화 및 제약 조건을 적용할 수 있어 다양한 테스트 케이스를 생성하는 데 적합합니다.
특징:
- 설계된 프로토콜이나 데이터의 특성에 맞춰 데이터를 표현
- SystemVerilog의 제약 조건을 통해 랜덤화 가능
예시 코드:
class ethernet_pkt extends uvm_sequence_item;
rand bit [47:0] dst_mac;
rand bit [47:0] src_mac;
rand bit [15:0] eth_type;
rand bit [31:0] payload;
constraint c_eth_type { eth_type == 16'h0800; } // IPv4 only
endclass
2. 드라이버 (Driver)
목적: 드라이버는 트랜잭션 데이터를 BFM(Bus Functional Model) 방식으로 처리하여 DUT에 전달하는 역할을 합니다. 드라이버는 시퀀서로부터 데이터를 받아 DUT에 신호를 전달합니다.
특징:
- 트랜잭션을 실제 신호로 변환하여 DUT와 통신
- 반복적 작업을 처리하고, 설계된 타이밍에 맞춰 신호를 주입
예시 코드:
class ethernet_driver extends uvm_driver#(ethernet_pkt);
virtual task run_phase(uvm_phase phase);
ethernet_pkt pkt;
forever begin
seq_item_port.get_next_item(pkt); // 시퀀서로부터 트랜잭션 수신
drive_packet(pkt); // DUT로 패킷 전송
seq_item_port.item_done(); // 완료 신호
end
endtask
virtual task drive_packet(ethernet_pkt pkt);
// 패킷의 각 필드를 DUT로 전송하는 로직
endtask
endclass
3. 시퀀서 (Sequencer)
목적: 시퀀서는 드라이버에게 전달할 트랜잭션의 순서를 제어합니다. 시퀀서는 다양한 트랜잭션을 랜덤하게 생성하거나 미리 정의된 시나리오에 따라 트랜잭션을 제공할 수 있습니다.
특징:
- 트랜잭션의 랜덤화를 제어하고, 다양한 테스트 시나리오를 지원
- 시퀀스 간 시간 제어 및 데이터 흐름 조정
예시 코드:
class ethernet_sequencer extends uvm_sequencer#(ethernet_pkt);
// 시퀀스 제어 로직
endclass
4. 모니터 (Monitor)
목적: 모니터는 수동적으로 신호를 감시하며, DUT에서 발생하는 트랜잭션을 관찰하고 기록합니다. 검증 환경에서 체크 및 커버리지 수집을 담당하며, 자가 검증 역할을 수행합니다.
특징:
- DUT 신호를 감시하고 트랜잭션을 수집
- 프로토콜 준수 여부 검사 및 커버리지 수집
- 드라이버와는 달리 신호를 구동하지 않고, 감시 및 기록에 중점을 둠
예시 코드:
class ethernet_monitor extends uvm_monitor;
virtual task run_phase(uvm_phase phase);
forever begin
// DUT에서 신호 수집 및 트랜잭션 변환
end
endtask
endclass
5. 에이전트 (Agent)
목적: 에이전트는 드라이버, 시퀀서, 모니터 등을 하나로 묶은 컴포넌트 집합체입니다. DUT와의 인터페이스를 설정하고, 트랜잭션을 주고받으며 검증을 수행합니다.
특징:
- 액티브 또는 패시브 모드로 동작
- 트랜잭션의 생성, 처리, 감시를 위한 모든 컴포넌트 포함
- 재사용성을 높여 다양한 검증 시나리오에서 유연하게 활용 가능
예시 코드:
class ethernet_agent extends uvm_agent;
ethernet_driver driver;
ethernet_sequencer sequencer;
ethernet_monitor monitor;
function new(string name, uvm_component parent);
super.new(name, parent);
driver = ethernet_driver::type_id::create("driver", this);
sequencer = ethernet_sequencer::type_id::create("sequencer", this);
monitor = ethernet_monitor::type_id::create("monitor", this);
endfunction
endclass
6. 환경 (Environment)
목적: 환경은 에이전트를 포함한 다양한 검증 컴포넌트를 통합하여 상위 검증 환경을 구성합니다. 환경은 전체 시스템을 검증하는 데 필요한 에이전트 및 다른 컴포넌트들을 조율하고 통합합니다.
특징:
- 다수의 에이전트를 포함하여 전체 시스템 검증 가능
- 확장 가능하며, 다른 검증 환경에서도 쉽게 재사용 가능
- 시뮬레이션 시 DUT와 상호작용하는 전체 검증 구조 관리
예시 코드:
class ethernet_env extends uvm_env;
ethernet_agent agent;
function new(string name, uvm_component parent);
super.new(name, parent);
agent = ethernet_agent::type_id::create("agent", this);
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-2. UVM Components (1) | 2024.09.26 |
[UVM 1.1d] 2. Transaction-Level Modeling (TLM) (0) | 2024.09.23 |
[UVM 1.1d] 1. Overview (0) | 2024.09.22 |
댓글