지노랩 /JinoLab
[UVM] 3.12.1 클래스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Classes) 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.12.1 클래스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Classes)
지노랩/JinoLab 2025. 3. 21. 13:071. 개요
- UVM에서 체크(Checks)와 커버리지(Coverage)는 uvm_monitor 클래스를 상속받은 클래스에서 구현됨.
- 모니터(monitor)는 항상 에이전트(agent) 내부에 존재하므로, 필수적인 체크 및 커버리지를 수행하는 역할을 함.
- 버스 모니터(bus monitor)는 기본적으로 환경(environment) 내에서 생성되며, 체크와 커버리지 수집 기능이 활성화되면 이를 수행.
- 본 절에서는 ubus_master_monitor를 예제로 사용하여 체크 및 커버리지 구현 방법을 설명.
2. 클래스에서 체크(Checks) 구현
(1) 체크 함수와 즉시(assertion-based) 체크 비교
- SystemVerilog의 즉시 어서션(immediate assertion)
- 간단한 체크에 적합 (짧고 명확한 코드 가능).
- 바로 실행되며 즉시 오류를 보고할 수 있음.
- 절차적 코드(procedural code) 기반의 체크 함수
- 더 복잡한 검증 로직이 필요한 경우 사용.
- 여러 줄의 코드가 필요한 경우, 함수로 구현하는 것이 디버깅에 유리.
(2) 즉시 어서션을 이용한 체크 (Simple Assertion Check)
예제: 전송 크기(transfer size) 체크
function void ubus_master_monitor::check_transfer_size();
check_transfer_size : assert(
trans_collected.size == 1 ||
trans_collected.size == 2 ||
trans_collected.size == 4 ||
trans_collected.size == 8
) else begin
`uvm_error("PROTOCOL", "잘못된 전송 크기 감지됨!");
end
endfunction : check_transfer_size
설명
- trans_collected.size 값이 1, 2, 4, 8 중 하나가 아니면 오류 발생.
- assert 문이 실패하면, uvm_error를 호출하여 프로토콜 위반 오류를 출력.
(3) 함수 기반 체크 (Procedural Check Function)
예제: 데이터 크기 불일치 체크
function void ubus_master_monitor::check_transfer_data_size();
if (trans_collected.size != trans_collected.data.size()) begin
`uvm_error("DATA_SIZE", "전송 크기 필드와 데이터 배열 크기가 일치하지 않음.");
end
endfunction : check_transfer_data_size
설명
- trans_collected.size와 trans_collected.data.size()가 다르면 전송 크기 필드 오류를 출력.
- 데이터 배열의 크기가 선언된 전송 크기와 일치하는지 검증.
(4) 체크 래퍼 함수 (Wrapper for Multiple Checks)
- 여러 개의 체크 함수가 같은 시점에 실행될 경우, 이를 하나의 래퍼 함수로 묶어서 호출 가능.
예제: 여러 체크 함수 실행
function void ubus_master_monitor::perform_transfer_checks();
check_transfer_size(); // 전송 크기 체크
check_transfer_data_size(); // 데이터 크기 불일치 체크
endfunction : perform_transfer_checks
설명
- perform_transfer_checks() 함수는 check_transfer_size()와 check_transfer_data_size()를 한 번에 호출.
- 모니터가 전송을 수집한 후 절차적으로 실행됨.
3. 클래스에서 커버리지(Coverage) 구현
(1) 커버리지 정의 (Using Covergroups)
- SystemVerilog의 covergroup을 활용하여 커버리지를 수집.
- 어떤 커버포인트(coverpoint)를 설정할지, 언제 커버리지를 샘플링할지, 어떤 빈(bin)을 생성할지를 미리 계획해야 함.
예제: 커버그룹 정의
// 전송 수집 비트(beat) 커버그룹
covergroup cov_trans_beat @cov_transaction_beat;
option.per_instance = 1;
// 주소(address) 커버리지 (16개 자동 빈 생성)
beat_addr : coverpoint addr {
option.auto_bin_max = 16;
}
// 읽기/쓰기 방향 커버리지
beat_dir : coverpoint trans_collected.read_write;
// 데이터 커버리지 (8개 자동 빈 생성)
beat_data : coverpoint data {
option.auto_bin_max = 8;
}
// 대기 상태(wait states) 커버리지
beat_wait : coverpoint wait_state {
bins waits[] = { [0:9] }; // 0~9 클럭 주기
bins others = { [10:$] }; // 10 이상 클럭 주기
}
// 크로스 커버리지 (주소 vs 읽기/쓰기 방향)
beat_addrXdir : cross beat_addr, beat_dir;
// 크로스 커버리지 (주소 vs 데이터)
beat_addrXdata : cross beat_addr, beat_data;
endgroup : cov_trans_beat
설명
- covergroup cov_trans_beat를 생성하고 @cov_transaction_beat 이벤트 발생 시 샘플링.
- beat_addr:
- 주소(addr) 값을 16개 구간(bin)으로 나누어 커버리지 측정.
- beat_dir:
- 읽기/쓰기(read_write) 여부를 커버리지 측정.
- beat_data:
- 데이터 값(data)을 8개 구간(bin)으로 나누어 커버리지 측정.
- beat_wait:
- 대기 상태(wait_state)를 두 개의 빈으로 구분 (0~9, 10 이상).
- beat_addrXdir 및 beat_addrXdata:
- 주소와 명령어 조합에 대한 크로스 커버리지 측정.
(2) 커버리지 샘플링 함수 (Coverage Sampling)
예제: 커버리지 샘플링 함수
// 커버리지 샘플링 수행
virtual protected function void perform_transfer_coverage();
cov_trans_beat.sample(); // 커버리지 샘플링
for (int unsigned i = 0; i < trans_collected.size; i++) begin
addr = trans_collected.addr + i;
data = trans_collected.data[i];
wait_state = trans_collected.wait_state[i];
cov_trans_beat.sample();
end
endfunction : perform_transfer_coverage
설명
- cov_trans_beat.sample()를 호출하여 커버리지 수집 수행.
- for 루프를 사용하여 동적 배열 요소별로 개별 샘플링 진행.
- SystemVerilog에서는 동적 배열 자체를 커버할 수 없으므로 개별 요소를 수동으로 샘플링.
(3) 체크 및 커버리지 함수 호출
예제: 전송이 수집된 후 체크 및 커버리지 수행
task run_phase(uvm_phase phase);
forever begin
@(posedge vif.clk);
perform_transfer_checks(); // 체크 수행
perform_transfer_coverage(); // 커버리지 샘플링 수행
end
endtask
설명
- 클럭 상승 엣지(posedge vif.clk)에서 체크와 커버리지 샘플링 수행.
4. 요약
- uvm_monitor를 상속받은 클래스에서 체크 및 커버리지 구현.
- 즉시 어서션(assert)을 사용하여 간단한 체크 수행 가능.
- 함수 기반 체크를 사용하면 더 복잡한 검증 가능.
- covergroup을 활용하여 특정 신호 및 이벤트 발생을 추적.
- 수집된 트랜잭션을 기반으로 커버리지 샘플링 수행.
✅ 이러한 기법을 활용하면, 보다 신뢰성 높은 UVM 기반 검증 환경을 구축할 수 있음.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl' 카테고리의 다른 글
| [UVM] 3.12.3 체크 및 커버리지 제어 (Controlling Checks and Coverage) (0) | 2025.03.22 |
|---|---|
| [UVM] 3.12.2 인터페이스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Interfaces) (0) | 2025.03.22 |
| [UVM] 3.12 체크 및 커버리지 구현 (Implementing Checks and Coverage) (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 |