지노랩 /JinoLab

[UVM] 3.12 체크 및 커버리지 구현 (Implementing Checks and Coverage) 본문

UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl

[UVM] 3.12 체크 및 커버리지 구현 (Implementing Checks and Coverage)

지노랩/JinoLab 2025. 3. 21. 12:05

 

1. 개요

  • 체크(Checks)와 커버리지(Coverage)는 커버리지 기반 검증(CDV, Coverage-Driven Verification)에서 필수적인 요소.
  • SystemVerilog에서는 assert, cover, covergroup 등의 구문을 사용하여 체크 및 커버리지를 구현 가능.
  • UVM 검증 환경에서 체크와 커버리지는 주로 uvm_monitor와 interface에서 정의됨.
  • SystemVerilog IEEE1800 LRM(언어 참조 매뉴얼)을 참고하여 구체적인 사용 방법을 익혀야 함.

2. SystemVerilog의 체크 및 커버리지 구문

SystemVerilog에서는 다양한 위치에서 assert, cover, covergroup을 사용할 수 있음. 아래 표는 각 구문의 사용 가능 여부를 나타냄.

(1) Table 5 — SystemVerilog Checks and Coverage Construct Usage Overview

Construct Class Interface Package Module Initial Always Generate Program

assert
cover
covergroup

3. UVM에서 체크 및 커버리지 적용

(1) 체크(Checks)

  • SystemVerilog의 assert 구문을 활용하여 기능적 요구사항을 만족하는지 확인 가능.
  • 인터페이스(interface)나 모니터(monitor)에서 프로토콜 관련 체크를 구현.

예제: 프로토콜 체크 (UVM Monitor에서 assert 사용)

class my_monitor extends uvm_monitor;
  virtual bus_if vif; // 가상 인터페이스

  task run_phase(uvm_phase phase);
    forever begin
      @(posedge vif.clk);
      assert(vif.req_valid === 1'b1) 
        else `uvm_error("PROTOCOL", "req_valid 신호가 활성화되지 않음");

      assert(vif.ack_delay < 10) 
        else `uvm_error("TIMING", "ACK 신호가 너무 늦게 발생함");
    end
  endtask
endclass

설명

  • assert(vif.req_valid === 1'b1)
    요청 신호(req_valid)가 반드시 1이어야 한다는 검증 수행.
  • assert(vif.ack_delay < 10)
    응답 신호(ACK)의 지연이 10 사이클을 초과하지 않도록 검증.
  • 위반될 경우 uvm_error()를 호출하여 로그에 오류 메시지 출력.

(2) 커버리지(Coverage)

  • SystemVerilog의 cover 및 covergroup을 활용하여 시뮬레이션에서 중요한 이벤트가 발생했는지 측정.
  • 주로 Monitor에서 특정 신호 조합이나 트랜잭션 유형이 충분히 발생했는지 확인.

예제: 커버리지 수집 (covergroup을 사용)

class my_monitor extends uvm_monitor;
  virtual bus_if vif; // 가상 인터페이스

  covergroup transaction_cov;
    option.per_instance = 1;
    
    // 주소 범위 커버리지
    coverpoint vif.addr {
      bins low = {[0:1023]};
      bins mid = {[1024:2047]};
      bins high = {[2048:4095]};
    }

    // 명령어 커버리지
    coverpoint vif.cmd {
      bins read  = {0}; 
      bins write = {1};
    }

    // 주소와 명령어의 크로스 커버리지
    cross vif.addr, vif.cmd;
  endgroup

  function new(string name = "my_monitor", uvm_component parent);
    super.new(name, parent);
    transaction_cov = new();
  endfunction

  task run_phase(uvm_phase phase);
    forever begin
      @(posedge vif.clk);
      transaction_cov.sample(); // 커버리지 수집
    end
  endtask
endclass

설명

  • covergroup transaction_cov를 정의하여 트랜잭션 수준 커버리지 측정.
  • coverpoint vif.addr → 주소(addr)가 3가지 범위(low, mid, high)에서 얼마나 자주 발생하는지 확인.
  • coverpoint vif.cmd → 명령어(cmd)가 읽기(read) 또는 쓰기(write)로 발생하는지 측정.
  • cross vif.addr, vif.cmd → 주소와 명령어 간 조합 커버리지(Cross Coverage) 측정.

4. UVM 환경에서 체크 및 커버리지 구성

(1) 체크 및 커버리지의 주요 위치

  • Interface: 기본적인 assertion-based 체크 및 간단한 커버리지.
  • Monitor: 신호 변화를 감지하고, 커버리지 수집 및 심화된 체크 수행.

(2) 체크 및 커버리지 예제 요약

검증 항목 적용 예제 주요 기능

프로토콜 체크 assert(vif.req_valid === 1'b1) 특정 신호가 올바르게 동작하는지 확인
타이밍 체크 assert(vif.ack_delay < 10) 응답 지연 시간이 일정 기준 이하인지 검증
주소 커버리지 coverpoint vif.addr 특정 주소 범위가 충분히 테스트되었는지 측정
명령어 커버리지 coverpoint vif.cmd 읽기/쓰기 명령이 골고루 실행되었는지 확인
크로스 커버리지 cross vif.addr, vif.cmd 주소와 명령의 조합이 충분히 검증되었는지 확인

5. 요약

  • UVM 검증 환경에서는 체크(assert)와 커버리지(covergroup)를 적절히 활용하여 설계의 안정성을 검증해야 함.
  • 체크(assert)는 신호 무결성 및 프로토콜 규칙을 보장하는 데 사용.
  • 커버리지(covergroup)는 다양한 입력 조건이 충분히 시뮬레이션되었는지 확인하는 데 사용.
  • Monitor 및 Interface에서 주요 체크 및 커버리지를 설정하여, 검증 환경의 신뢰성을 높일 수 있음.

6. 결론

  • 체크와 커버리지는 검증 환경에서 중요한 역할을 하며, 이를 적절히 활용하면 보다 신뢰성 높은 설계를 검증할 수 있음.
  • assert 구문을 사용하여 실시간으로 프로토콜을 체크하고, covergroup을 통해 다양한 입력 조합이 충분히 테스트되었는지 확인해야 함.
  • 이러한 기법을 활용하여 강력한 UVM 기반 검증 환경을 구축할 수 있음.

 

 

 


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.