UVM sequence의 body()에서 request item을 보내고, driver가 처리 결과를 response item으로 반환하면 된다. virtual interface는 top에서 uvm_config_db로 설정하고 driver가 build_phase에서 받아 DUT interface에 접근한다.
virtual interface 전달
Top module에는 실제 interface instance를 만들고, UVM component 계층의 driver 경로에 설정한다.
bus_if bus_if_inst(clk);
initial begin
uvm_config_db#(virtual bus_if)::set(
null, "uvm_test_top.env.agent.driver", "vif", bus_if_inst
);
run_test();
end
Driver는 같은 key를 조회하고, 설정이 없으면 조용히 진행하지 말고 오류를 낸다.
virtual bus_if vif;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
if (!uvm_config_db#(virtual bus_if)::get(this, "", "vif", vif))
`uvm_fatal("NO_VIF", "driver virtual interface was not configured")
endfunction
uvm_test_top.env.agent.driver는 예시 경로다. 실제 테스트벤치의 component 이름과 계층에 맞춰 설정 경로를 지정한다.
sequence에서 request를 보내고 response 받기
Sequence는 run_phase가 아니라 body()에서 transaction을 만든다. finish_item()이 끝난 뒤 response를 요청하려면 get_response()를 호출한다.
task body();
bus_item req;
bus_item rsp;
req = bus_item::type_id::create("req");
start_item(req);
req.addr = 'h20;
req.is_read = 1;
finish_item(req);
get_response(rsp);
`uvm_info("READ", $sformatf("data=%h", rsp.data), UVM_MEDIUM)
endtask
Driver는 get_next_item()으로 request를 받은 뒤 interface를 통해 동작을 완료하고, response의 sequence/transaction ID를 request에서 복사해 돌려준다.
task run_phase(uvm_phase phase);
bus_item req;
bus_item rsp;
forever begin
seq_item_port.get_next_item(req);
// Drive the interface and capture the response data.
rsp = bus_item::type_id::create("rsp");
rsp.set_id_info(req);
rsp.data = vif.read_data;
seq_item_port.item_done(rsp);
end
endtask
vif.read_data는 흐름을 보여주기 위한 자리 표시자다. 실제 driver에서는 protocol handshake가 완료된 시점의 값을 넣어야 한다. item_done(rsp)는 request 처리를 끝내면서 response를 sequence로 반환한다.
이 코드는 bus_item 정의, factory 등록, sequence/driver 연결을 생략한 흐름 예제이며 그대로 compile되는 완성 testbench는 아니다.
확인할 점
get()과set()의 type, field name, component path가 일치해야 한다.- response는 request와 별도 object로 만들고
set_id_info(req)를 호출한다. get_response()가 필요한 응답을 받도록 response queue와 transaction ID 사용을 확인한다.- 이 예제는 UVM transaction 전달만 설명한다. AXI handshake 구현이나 protocol timing을 검증한 driver 예제가 아니다.
공식 자료
- Accellera UVM reference implementation (IEEE 1800.2-2020)
- Accellera UVM downloads and standards
- UVM
uvm_config_dbimplementation - UVM sequence base implementation
원문 기록
- UVM - Interface 에서 Drive로 Sequence item으로 데이터 받기
- UVM sequence - 메인함수는 body task
- UVM Configuration Database (uvm_config_db) 사용 예제
한 줄 요약
body()가 request를 보내고 driver가 ID를 보존한 response를 반환하며, virtual interface는 component 경로에 맞춰 uvm_config_db로 전달한다.