[UVM 1.1d] 7-2. UBus Verification Example
본문 바로가기
지식 공유/UVM

[UVM 1.1d] 7-2. UBus Verification Example

by 긍수저 2024. 11. 26.

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

주요 분석

  1. 컴포넌트 생성: Master/Slave Agent와 Monitor가 build_phase에서 생성됩니다.
  2. 데이터 연결: 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

주요 분석

  1. Virtual Interface 관리: uvm_config_db를 통해 Virtual Interface를 설정.
  2. 트랜잭션 실행: 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

주요 분석

  1. 시퀀서 역할 단순화: UBus 트랜잭션을 관리하며 Driver에 제공.
  2. 확장성: 다양한 Sequence와 연결될 수 있는 구조.

결론

  • UBus Environment: 에이전트와 모니터를 통합하며 데이터 흐름을 설정.
  • UBus Driver: Sequencer로부터 트랜잭션을 받아 DUT와 연결.
  • UBus Sequencer: Sequence와 Driver 간의 데이터를 조정.

이 예제는 UVM의 기본 원칙인 모듈화와 계층화된 구조를 잘 보여줍니다. UBus 예제는 다양한 검증 환경에서 쉽게 적용할 수 있는 템플릿을 제공합니다.

반응형

댓글