[SystemVerilog 실무] 9. Functional Coverage의 이해
본문 바로가기
지식 공유/SystemVerilog

[SystemVerilog 실무] 9. Functional Coverage의 이해

by 긍수저 2025. 5. 10.
반응형

SystemVerilog에서 Functional Coverage는 단순히 테스트가 실행되었는지를 넘어서 **"테스트가 어떤 상황을 실제로 검증했는가"**를 정량화하는 데 핵심적인 역할을 합니다. 이번 포스트에서는 Functional Coverage의 개념부터 covergroup 작성법, bins 설정, 주요 메서드 및 시스템 함수까지 실습 중심으로 정리해보겠습니다.

Functional Coverage란?

  • 설계 명세서(Specification)를 기준으로, 테스트가 해당 명세를 얼마나 커버했는지를 측정하는 기법입니다.
  • 사용자가 직접 coverage 항목을 정의해야 하며, 시뮬레이터가 자동으로 추출해주지 않습니다.
  • 구조 커버리지(코드 기반)와 달리, 설계 코드와는 독립적인 방식으로 정의됩니다.
  • 체계적인 검증 전략 수립을 위해 필수적인 도구입니다.

Covergroup 개념과 구문

  • Covergroup은 시뮬레이션 중 특정 변수나 표현식을 추적하고 coverage 데이터를 수집합니다.
  • 구문 예시:
covergroup cg @ (posedge clk);
  cp : coverpoint op_mode {
    bins idle = {0};
    bins read = {1};
    bins write = {2};
  }
  cross cp, addr;
endgroup
  • 주요 구성 요소:
    • @(<clocking_event>): 샘플링 시점 정의 (예: posedge clk)
    • coverpoint: 추적할 표현식 정의
    • bins: 추적 값의 범위 정의
    • cross: coverpoint 간의 상호작용 정의

Coverpoint와 bins

  • coverpoint는 특정 표현식(변수 등)의 값 출현 여부를 기록합니다.
  • bins는 특정 값이나 범위가 발생했는지를 추적하는 단위입니다.
coverpoint addr {
  bins low_range[] = {[0:3]};
  bins high_range[] = {[4:7]};
}
  • 자동 bin 생성: option.auto_bin_max를 활용하여 자동으로 bin을 분할할 수 있습니다.

옵션 설명 예시 코드
bins 값 범위나 개별 값을 추적하는 기본적인 bin. bins valid_op = {[0:6]};
bins[] 배열 형태로 여러 개의 값을 그룹화하여 추적. bins invalid_op[] = {};
wildcard 특정 값 대신 와일드카드(*)를 사용하여 범위나 값을 추적. wildcard bins result = { 2'b1? };
with 특정 조건에 맞는 값을 추적하기 위한 조건 지정. bins data[] = {[0:63]} with (item % 3 == 0);
transition 값의 전이를 추적하는 데 사용. 주로 두 값 간의 상태 변화 추적. bins transition[] = (0=>4, [5:6]=>[7:9] );
illegal_bins 지원되지 않는 값에 대해 커버리지를 추적. (hit 할 경우, 강제 종료) bins illegal_values[] = default;
ignore_bins 특정 값을 커버리지 추적에서 제외하고 싶을 때 사용. bins ignore_this[] = {16, 20};

Covergroup 옵션

  • option.auto_bin_max = 4;: 자동으로 4개의 bin으로 분할
  • option.per_instance = 1;: 각 인스턴스 별로 독립적인 coverage 추적
  • option.comment = "for addr coverage";: 주석 삽입

주요 메서드 및 System Function

  • 메서드
    • sample(): 샘플링을 강제로 수행
    • get_coverage(): 커버리지 백분율 반환
    • start(), stop(): 수집 시작/중지

  • 시스템 함수
    • $set_coverage_db_name("mycov"): coverage DB 이름 설정
    • $load_coverage_db("mycov"): 지정된 DB 로드
    • $get_coverage(): 전체 coverage 값 반환

Deep Talk: Program Block과 레이스 방지

  • program 블록은 TB 코드와 RTL 간의 레이스 없이 상호작용을 보장합니다.
  • program test (input clk); initial begin // 테스트 로직 end endprogram
  • 특징:
    • initial, final 블록만 사용 가능
    • always, module, interface는 포함 불가
    • 클로킹 블록을 통해 레이스 없이 안정적인 시뮬레이션 가능

예시 구조도

다음과 같은 구성으로 coverage 환경을 설계할 수 있습니다:

Top Module
├── Interface
├── DUT
├── Driver
├── Monitor
├── Scoreboard
├── Covergroup Model
└── Program Test

 

반응형

댓글