반응형
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
반응형
'지식 공유 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog 실무] 10. Assertion 이해 및 활용 (0) | 2025.05.10 |
---|---|
[SystemVerilog 실무] 8. Package와 Interface (0) | 2025.05.10 |
[SystemVerilog 실무] 7. 랜덤 테스트와 Constraints 기초 (0) | 2025.05.10 |
[SystemVerilog 실무] 6. SystemVerilog OOP: 캡슐화, 상속, 다형성 (0) | 2025.05.10 |
[SystemVerilog 실무] 5. SystemVerilog 클래스 기초 완전정복 (0) | 2025.05.10 |
[SystemVerilog 실무] 4. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
댓글