본문 바로가기

HDL/UVM

[UVM] Drivers

반응형

 

UVM Driver는 testbench에서 Transaction을 전송하는 형태이다. 

 

UVM Driver의 예제코드들은 대부분 아래와 같이 사용된다. 

여기에 짝으로 UVM Monitor등을 달아서 트랜잭션이 제대로 전달되었는지를 확인한다. 

 

이것 처음보다보면, 왜 이 지점에서 이런것들이 나오는지 이해하기가 쉽지 않은 면이 있다. 

갑자기 uvm_config_db가 나오는 것도 그렇고, build_phase라든지, run_phase라든지, 처음보는 입장에서는 맥락없는 장치들이 다수 있다. 

이것들은  UVM으로 merge되기전에 OVM이라든지 VMM이라든지 각 회사들의 철학이 녹아들어있던것을 UVM으로 merge하다보니 몇몇 부분에서는 설명이 메뉴얼에도 없고, 잘안되어 있는 부분들이 존재한다. 

 

그래서 일단은 익숙해질때까지 반복사용하는것을 추천한다. 

 

아래는 많이 나오는 예제형태이다. 

class simple_driver extends uvm_driver #(simple_transaction);
  uvm_analysis_port #(simple_transaction) ap;
  simple_if intf;
  
  function new(string name, uvm_component parent);
    super.new(name, parent);
    ap = new("ap", this);
  endfunction
  
  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    if (!uvm_config_db #(virtual simple_if)::get(this, "", "vif", intf)) begin
      `uvm_fatal("NOVIF", "No virtual interface set for: " , get_full_name(), ".vif")
    end
  endfunction
  
  task run_phase(uvm_phase phase);
    forever begin
      seq_item_port.get_next_item(req);
      drive();
      seq_item_port.item_done();
      ap.write(req);
    end
  endtask
  
  task drive();
    @(posedge intf.clk);
    intf.data = req.data;
    intf.addr = req.addr;
    @(posedge intf.clk);
  endtask
  
endclass : simple_driver

 

이 코드에서는 simple_driver라는 이름의 UVM 드라이버 클래스를 생성했다. 이 클래스는 UVM 드라이버를 확장하고 simple_transaction 타입의 트랜잭션을 사용한다.

생성자 함수에서는 uvm_analysis_port를 생성했다. build_phase 함수에서는 virtual interface를 설정했다. 이 interface는 DUT와 신호를 주고받는 데 사용된다.

run_phase 함수에서는 트랜잭션을 수신하고 처리하는 로직이 포함되어 있다. 이 함수는 반복해서 실행되며, 각 반복마다 트랜잭션을 수신하고, drive 함수를 통해 처리하고, 처리 완료 신호를 보낸다.

drive 함수에서는 DUT에 신호를 보내는 코드가 있다. 여기서는 간단하게 클록 엣지에 맞춰 데이터와 주소를 DUT에 보내는 코드만 포함되어 있다.

이는 매우 간단한 예제로, 실제 UVM 드라이버는 보다 복잡하고 다양한 기능을 포함할 수 있다. 이 예제가 UVM 드라이버에 대한 이해를 돕는 데 도움이 되길 바란다.

반응형

'HDL > UVM' 카테고리의 다른 글

[UVM] uvm_config_db 관련  (0) 2023.09.15
[UVM] Agent  (0) 2023.07.19
[UVM] virtual sequencer를 사용하는 목적  (0) 2023.07.17
UVM Tests (테스트 시나리오)  (0) 2019.12.24