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

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

by 긍수저 2024. 12. 1.

7.10 UBus Agent Monitor

역할

  • 트랜잭션 감시: DUT와의 신호 상호작용을 모니터링하며, 이를 ubus_transfer 객체로 변환.
  • 데이터 전달: 생성된 트랜잭션 데이터를 analysis_port를 통해 다른 컴포넌트(예: Scoreboard)에 전달.
  • 체크 및 커버리지: 프로토콜 체크와 커버리지 수집 기능을 제공합니다.

예제 코드

class ubus_agent_monitor extends uvm_monitor;
  `uvm_component_utils(ubus_agent_monitor)

  virtual ubus_if vif;
  uvm_analysis_port#(ubus_transfer) analysis_port;

  function new(string name, uvm_component parent);
    super.new(name, parent);
    analysis_port = new("analysis_port", this);
  endfunction

  virtual function void build_phase(uvm_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);
    forever begin
      ubus_transfer trans = new();
      trans.addr = vif.addr;
      trans.data = vif.data;
      trans.write = vif.write;

      analysis_port.write(trans);

      @(posedge vif.clk); // 클럭 동기화
    end
  endtask
endclass

체크 및 커버리지 예제

  • 체크: UBus의 크기 필드를 검증하는 assertion.
  • 커버리지: UBus 트랜잭션 필드의 커버리지를 수집하는 covergroup.
systemverilog
function void check_transfer_size();
  assert(trans_collected.size == 1 || 
         trans_collected.size == 2 || 
         trans_collected.size == 4 || 
         trans_collected.size == 8)
    else $error("Invalid transfer size!");
endfunction

covergroup cov_trans_beat @(posedge vif.clk);
  beat_addr : coverpoint trans_collected.addr;
  beat_data : coverpoint trans_collected.data;
  beat_wait : coverpoint trans_collected.wait_state {
    bins wait_states[] = { [0:3] };
  }
endgroup

7.11 UBus Bus Monitor

역할

  • 버스 활동 감시: UBus 신호 인터페이스를 감시하고 ubus_transfer 트랜잭션을 수집.
  • 알림 포트: 상태 변경 및 수집된 트랜잭션을 state_port와 item_collected_port를 통해 전달.

주요 기능

  1. 버스 상태 감지: 상태 변경 사항(RST_START, ACTIVE 등)을 감지하여 TLM 포트를 통해 전달.
  2. 슬레이브 응답 확인: 수집된 주소를 바탕으로 적절한 슬레이브가 응답했는지 확인.

체크 및 커버리지 활성화 코드

systemverilog
코드 복사
uvm_config_db#(bit)::set(this, "ubus0.monitor", "checks_enable", 1); uvm_config_db#(bit)::set(this, "ubus0.monitor", "coverage_enable", 1);

Assertion 예제

systemverilog
always @(posedge sig_clock) begin
  assertAddrUnknown: assert property (
    disable iff(!checks_enable)
    (sig_grant |-> ! $isunknown(sig_addr)))
  else $error("ERR_ADDR_XZ: Address went to X or Z during Address Phase");
end

7.12 UBus Interface

역할

UBus Interface는 DUT와 UVM 테스트벤치를 연결하는 가상 인터페이스로, 신호 정의와 클럭 생성 등의 기능을 제공합니다.

예제 코드

systemverilog
interface ubus_if(input logic clk);
  logic [31:0] addr;
  logic [31:0] data;
  logic write, read, reset;

endinterface

Assertions in Interface

  • 주소 검증: Address Phase 중 주소 신호의 유효성을 확인합니다.
systemverilog
always @(posedge sig_clock) begin
  assertAddrValid: assert property (
    disable iff(!checks_enable)
    (sig_grant |-> ! $isunknown(sig_addr)))
  else $error("Invalid address during Address Phase");
end

요약

  1. UBus Agent Monitor:
    • 트랜잭션 수집 및 전달.
    • 프로토콜 체크와 커버리지 수집.
  2. UBus Bus Monitor:
    • 버스 상태 감시 및 슬레이브 응답 확인.
    • 상태와 데이터의 변경 사항을 알림 포트로 전달.
  3. UBus Interface:
    • DUT와 테스트벤치를 연결하는 가상 인터페이스.
    • 물리적 신호의 유효성을 검증하기 위한 Assertion 포함.

위의 구성 요소들은 UBus 검증 환경에서 중요한 역할을 수행하며, 확장성과 재사용성을 높이는 데 기여합니다.

반응형

댓글