지노랩 /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:051. 개요
- 체크(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
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.12.2 인터페이스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Interfaces) (0) | 2025.03.22 |
|---|---|
| [UVM] 3.12.1 클래스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Classes) (0) | 2025.03.21 |
| [UVM] 3.11 테스트 종료 관리 (Managing End of Test) (0) | 2025.03.20 |
| [UVM] 3.10.4 시퀀스 아이템 및 시퀀스 오버라이딩 (Overriding Sequence Items and Sequences) (0) | 2025.03.20 |
| [UVM] 3.10.3 Sequencer에서 Sequence 실행하기 (0) | 2025.03.19 |