#fpga/asic 수정: 2026-10-20

UVM sequence와 driver 사이에서 response를 주고받는 방법

UVM sequence의 body task에서 요청을 보내고 driver의 item_done(response)로 읽기 결과를 돌려받는 기본 흐름입니다.

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 예제가 아니다.

공식 자료

원문 기록

한 줄 요약

body()가 request를 보내고 driver가 ID를 보존한 response를 반환하며, virtual interface는 component 경로에 맞춰 uvm_config_db로 전달한다.

광고