7.6 UBus Environment
UBus Environment는 검증 환경의 상위 컨테이너로, 에이전트와 모니터, 스코어보드 등 다양한 컴포넌트를 포함합니다.
주요 역할
- 에이전트 관리: Master와 Slave Agent를 생성하고 환경 내에 통합.
- 데이터 흐름 관리: 모니터와 스코어보드 간 연결 설정.
예제 코드
class ubus_env extends uvm_env;
`uvm_component_utils(ubus_env)
ubus_master_agent master_agent;
ubus_slave_agent slave_agent;
ubus_monitor bus_monitor;
function new(string name = "ubus_env", uvm_component parent = null);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
master_agent = ubus_master_agent::type_id::create("master_agent", this);
slave_agent = ubus_slave_agent::type_id::create("slave_agent", this);
bus_monitor = ubus_monitor::type_id::create("bus_monitor", this);
endfunction
virtual function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
// Monitor와 Scoreboard 간의 데이터 흐름 설정
bus_monitor.ap.connect(slave_agent.analysis_export);
endfunction
endclass
주요 분석
- 컴포넌트 생성: Master/Slave Agent와 Monitor가 build_phase에서 생성됩니다.
- 데이터 연결: Connect Phase에서 analysis_port를 활용해 데이터를 Scoreboard로 전달합니다.
7.7 UBus Driver
UBus Driver는 Sequencer로부터 시퀀스를 받아서 DUT에 적용할 트랜잭션을 생성합니다.
주요 역할
- Sequencer로부터 받은 트랜잭션을 DUT 신호로 변환.
- UBus 인터페이스를 통해 DUT와 연결.
예제 코드
class ubus_driver extends uvm_driver#(ubus_transfer);
`uvm_component_utils(ubus_driver)
virtual ubus_if vif;
function new(string name = "ubus_driver", uvm_component parent = null);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
if (!uvm_config_db#(virtual ubus_if)::get(this, "", "vif", vif)) begin
`uvm_fatal("NOVIF", "Virtual interface must be set.");
end
endfunction
virtual task run_phase(uvm_phase phase);
ubus_transfer trans;
forever begin
// Sequencer로부터 트랜잭션 요청
seq_item_port.get_next_item(trans);
// DUT로 트랜잭션 전달
vif.addr <= trans.addr;
vif.data <= trans.data;
vif.read <= trans.read;
seq_item_port.item_done();
end
endtask
endclass
주요 분석
- Virtual Interface 관리: uvm_config_db를 통해 Virtual Interface를 설정.
- 트랜잭션 실행: Sequencer로부터 트랜잭션을 가져와 DUT에 전달합니다.
7.8 UBus Sequencer
Sequencer는 Driver와 Sequence 간의 데이터 흐름을 조정하며, 시퀀스에서 생성된 트랜잭션을 Driver에 전달합니다.
주요 역할
- 시퀀스에서 트랜잭션을 생성하고 Driver로 전달.
- 데이터 흐름의 순서와 제어를 담당.
예제 코드
class ubus_sequencer extends uvm_sequencer#(ubus_transfer);
`uvm_component_utils(ubus_sequencer)
function new(string name = "ubus_sequencer", uvm_component parent = null);
super.new(name, parent);
endfunction
endclass
주요 분석
- 시퀀서 역할 단순화: UBus 트랜잭션을 관리하며 Driver에 제공.
- 확장성: 다양한 Sequence와 연결될 수 있는 구조.
결론
- UBus Environment: 에이전트와 모니터를 통합하며 데이터 흐름을 설정.
- UBus Driver: Sequencer로부터 트랜잭션을 받아 DUT와 연결.
- UBus Sequencer: Sequence와 Driver 간의 데이터를 조정.
이 예제는 UVM의 기본 원칙인 모듈화와 계층화된 구조를 잘 보여줍니다. UBus 예제는 다양한 검증 환경에서 쉽게 적용할 수 있는 템플릿을 제공합니다.
반응형
'지식 공유 > UVM' 카테고리의 다른 글
[UVM 1.1d] 9. Directed-Test Style (v.s. UVM Style) (0) | 2024.12.01 |
---|---|
[UVM 1.1d] 8. UVM Sequence Library (1) | 2024.12.01 |
[UVM 1.1d] 7-3. UBus Verification Example (0) | 2024.12.01 |
[UVM 1.1d] 7-1. UBus Verification Example (0) | 2024.11.24 |
[UVM 1.1d] 6-3. Advanced UVM Topics (UVM CLI) (0) | 2024.11.19 |
[UVM 1.1d] 6-2. Advanced UVM Topics (SEQ_LIB, Layering) (0) | 2024.11.13 |
댓글