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

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

by 긍수저 2024. 11. 24.

7.3 UBus Top Module

Top Module은 DUT(Design Under Test)와 UVM 기반 테스트벤치를 연결하는 역할을 합니다. 여기서는 SystemVerilog 인터페이스를 사용해 DUT와 테스트벤치 간의 신호를 연결하고, 시뮬레이션을 초기화합니다.

Top Module 예제 (ubus_tb_top.sv)

module ubus_tb_top;

  import uvm_pkg::*;
  import ubus_pkg::*;
  `include "test_lib.sv"

  ubus_if vif(); // UBus 인터페이스 인스턴스화
  dut_dummy dut(
    vif.sig_request[0],
    vif.sig_grant[0],
    ...
    vif.sig_reset
  );

  initial begin
    uvm_config_db#(virtual ubus_if)::set(null, "ubus_example_tb0.*", "vif", vif);
    run_test();
  end

  // 클록 생성
  always #5 vif.sig_clock = ~vif.sig_clock;

endmodule

주요 특징

  1. UBus 인터페이스 연결: 인터페이스 ubus_if를 사용하여 DUT와 테스트벤치를 연결합니다.
  2. run_test 호출: UVM 테스트를 실행하기 위해 run_test를 호출하며, 테스트 이름을 지정합니다.

7.4 The Test

Test 클래스는 특정 UBus 시나리오를 정의하는 최상위 UVM 컴포넌트입니다. 여기에서는 read_modify_write 테스트 시나리오를 구현합니다.

Test 클래스 예제 (test_read_modify_write)

class test_read_modify_write extends ubus_example_base_test;
  `uvm_component_utils(test_read_modify_write)

  function new(string name = "test_read_modify_write", uvm_component parent = null);
    super.new(name, parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    uvm_config_db#(uvm_object_wrapper)::set(this,
      "ubus_example_tb0.ubus0.masters[0].sequencer.main_phase", 
      "default_sequence",
      read_modify_write_seq::type_id::get()
    );
  endfunction
endclass

주요 특징

  1. 환경 설정: uvm_config_db를 사용하여 main_phase에서 실행될 기본 시퀀스를 설정합니다.
  2. 유연한 테스트 실행: 다양한 테스트 시나리오를 적용할 수 있도록 시퀀스를 설정합니다.

7.5 Testbench Environment

테스트벤치는 ubus_env와 같은 환경 클래스를 포함하며, Master/Slave Agent, Monitor, Scoreboard와 같은 검증 요소를 통합합니다.

Testbench Environment 예제 (ubus_example_tb.sv)

class ubus_example_tb extends uvm_env;
  `uvm_component_utils(ubus_example_tb)

  ubus_env ubus0;
  ubus_example_scoreboard scoreboard0;

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    uvm_config_db#(int)::set(this, ".ubus0", "num_masters", 1);
    uvm_config_db#(int)::set(this, ".ubus0", "num_slaves", 1);
    ubus0 = ubus_env::type_id::create("ubus0", this);
    scoreboard0 = ubus_example_scoreboard::type_id::create("scoreboard0", this);
  endfunction

  virtual function void connect_phase(uvm_phase phase);
    ubus0.slaves[0].monitor.item_collected_port.connect(
      scoreboard0.item_collected_export
    );
  endfunction
endclass

주요 특징

  1. 환경 설정: Master/Slave Agent 수를 동적으로 설정합니다.
  2. 데이터 흐름 연결: Monitor에서 Scoreboard로 데이터를 전달해 결과를 검증합니다.

7.6 UBus Environment

UBus Environment는 Agent, Monitor, Scoreboard 등 주요 검증 컴포넌트를 통합하여 검증 환경을 구성합니다.

Environment 주요 구성

  • Master/Slave Agent: 동적으로 설정 가능한 Agent 수를 통해 유연성을 제공합니다.
  • Bus Monitor: UBus 프로토콜의 준수 여부를 확인하고 커버리지를 수집합니다.

Environment 초기화 예제

class ubus_env extends uvm_env;
  `uvm_component_utils(ubus_env)

  // 주요 컴포넌트 선언
  ubus_bus_monitor bus_monitor;
  ubus_master_agent master_agent;
  ubus_slave_agent slave_agent;

  virtual ubus_if vif; // Virtual Interface

  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);

    // Virtual Interface 가져오기
    if (!uvm_config_db#(virtual ubus_if)::get(this, "", "vif", vif)) begin
      `uvm_fatal("NOVIF", "Virtual interface must be set.");
    end

    // 각 컴포넌트 생성
    bus_monitor = ubus_bus_monitor::type_id::create("bus_monitor", this);
    master_agent = ubus_master_agent::type_id::create("master_agent", this);
    slave_agent = ubus_slave_agent::type_id::create("slave_agent", this);
  endfunction

  virtual function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);

    // Monitor와 에이전트 간 연결
    bus_monitor.analysis_port.connect(master_agent.analysis_export);
    bus_monitor.analysis_port.connect(slave_agent.analysis_export);
  endfunction
endclass

주요 기능

  • 에이전트 및 Monitor 생성: 환경 내 에이전트 및 모니터를 생성하여 각 역할을 수행합니다.
  • Scoreboard와의 데이터 연결: Monitor가 수집한 데이터를 Scoreboard로 전달하여 검증합니다.

결론

UBus 검증 예제는 UVM 기반 검증 환경을 이해하고 구축하는 데 있어 매우 유용한 사례입니다. 주요 구성 요소는 다음과 같습니다:

  1. Top Module: DUT와 테스트벤치 간의 연결 및 초기화.
  2. Test 클래스: 시나리오 정의 및 시퀀스 실행.
  3. Environment: 검증 환경을 구성하는 Agent, Monitor, Scoreboard의 통합.

이 예제는 UVM의 구성 요소 간 데이터 흐름동적 설정을 효과적으로 보여줍니다. 이를 통해 검증 환경의 재사용성을 극대화하고, 다양한 테스트 요구사항을 충족할 수 있습니다.

반응형

댓글