지노랩 /JinoLab

[UVM] 5.4 커버리지 모델 – RAL 내부에서도 “무엇을 얼마나 덮었는가”를 보려면 본문

UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기

[UVM] 5.4 커버리지 모델 – RAL 내부에서도 “무엇을 얼마나 덮었는가”를 보려면

지노랩/JinoLab 2025. 5. 6. 09:05

 

5.4.0 왜 레지스터 커버리지가 별도인가?

  • 레지스터 모델(필드·주소·배치)은 칩마다 천차만별 → 고정된 covergroup 템플릿이 불가능
  • 모델 생성기(Generator) 가 설계 스펙 → RAL 클래스를 만들 때 필드 맞춤형 covergroup 을 삽입해야 한다.
  • 대규모 RAL(수천 레지스터)에서 전부 커버리지 ON 하면 메모리·성능 폭발선택적 인스턴스 & 샘플링 제어 API 필수.

5.4.1 사전 정의된 커버리지 ID (Table 6)

심볼 값 의미 비트 위치

UVM_NO_COVERAGE 커버리지 없음 0
UVM_CVR_REG_BITS 레지스터 비트가 읽히거나 쓰인 번수 1
UVM_CVR_ADDR_MAP 어드레스(맵) 접근 분포 2
UVM_CVR_FIELD_VALS 필드 값 분포 (예: 상태비트 0/1 빈도) 3
UVM_CVR_ALL 위 3가지를 OR 0–3

0–7 : UVM 예약 / 8–15 : 벤더 / 16–23 : 사용자 / 24↑ : 미래용
여러 모델을 동시에 켤 땐 비트 OR : UVM_CVR_REG_BITS | UVM_CVR_FIELD_VALS


5.4.2 커버리지 생성(Construction)샘플링 제어

① 생성 단계 – include_coverage()

// 블록 인스턴스 생성 직후(예: build_phase)  
codec.include_coverage("*",                // 와일드카드: 블록 내부 전체
                       UVM_CVR_REG_BITS    // 비트 커버 + 필드 값
                     | UVM_CVR_FIELD_VALS);
  • 기본값은 생성 X → 메모리 절약
  • 단위(유닛) 검증 단계에서만 켜고, SoC 단계에서는 꺼두는 것이 일반적

② 샘플링 단계 – set_coverage()

// 시뮬 초반: 커버리지 sampling ON
codec.set_coverage(UVM_CVR_REG_BITS, 1);   // 1=Enable
codec.CONFIG.set_coverage(UVM_CVR_FIELD_VALS, 1);

// 성능 프로파일링 후 OFF 가능
codec.set_coverage(UVM_CVR_REG_BITS, 0);

범위 메서드 적용 대상

uvm_reg_block::set_coverage() 블록 전체/하위 포함
uvm_reg::set_coverage() 특정 레지스터만
uvm_mem::set_coverage() 특정 메모리만

5.4.3 현업 Best Practice

시나리오 커버리지 전략

IP 단위 검증 include_coverage("*", UVM_CVR_ALL) – 샘플링 전부 ON
서브시스템 검증 Register Bits, Field Vals 만 켜고 AddrMap OFF → 용량 절약
SoC 회귀 생성 자체를 OFF (UVM_NO_COVERAGE) + 코드·FSM implicit coverage 로만 체크
버그 집중 조사 문제 레지스터만 set_coverage(...,1) 로 재실행


 

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