Skip to content
DevBJ
Go back

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

Editor

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는 아니다.

확인할 점

공식 자료

원문 기록

한 줄 요약

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


Share this post on: