지노랩 /JinoLab
[UVM] 3.12.3 체크 및 커버리지 제어 (Controlling Checks and Coverage) 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.12.3 체크 및 커버리지 제어 (Controlling Checks and Coverage)
지노랩/JinoLab 2025. 3. 22. 13:121. 개요
- 검증 환경에서 체크(checks)와 커버리지(coverage)를 활성화하거나 비활성화할 수 있어야 함.
- UVM에서는 uvm_config_db 인터페이스를 사용하여 설정 값을 제어할 수 있음.
- 비트 필드(bit 또는 int)를 활용하여 특정 체크 및 커버리지 수집 기능을 ON/OFF 가능.
- 예제에서는 checks_enable과 coverage_enable 필드를 사용하여 모니터링 기능을 제어하는 방법을 설명.
2. 체크 기능 제어
(1) checks_enable을 사용한 체크 기능 ON/OFF
- 체크 기능이 필요할 경우 실행하고, 그렇지 않으면 실행하지 않도록 설정 가능.
- 해당 설정은 uvm_config_db를 통해 조정 가능.
예제: checks_enable을 이용한 체크 기능 제어
class master_monitor extends uvm_monitor;
bit checks_enable = 1; // 기본값: 체크 활성화
`uvm_component_utils_begin(master_monitor)
`uvm_field_int(checks_enable, UVM_ALL_ON)
`uvm_component_utils_end
virtual protected task collect_transactions();
forever begin
@(posedge xmi.sig_clock);
... // 신호 수집
if (checks_enable) // 체크 활성화 여부 확인
perform_transfer_checks();
end
endtask
virtual protected function void perform_transfer_checks();
`uvm_info("MONITOR", "Transfer checks are being performed", UVM_MEDIUM);
// 실제 체크 코드 추가
endfunction
endclass
설명
- checks_enable 필드를 bit 타입으로 선언하여 체크 기능을 ON/OFF 가능.
- collect_transactions() 내에서 checks_enable이 1일 때만 perform_transfer_checks() 실행.
- checks_enable이 0이면 체크 기능이 완전히 비활성화됨.
(2) uvm_config_db를 사용하여 checks_enable 값 변경
- 테스트 환경에서 특정 모니터의 체크 기능을 OFF로 설정 가능.
예제: 특정 모니터(master0.monitor)의 체크 기능 OFF
uvm_config_db#(int)::set(this, "masters[0].monitor", "checks_enable", 0);
설명
- "masters[0].monitor" 경로를 따라 checks_enable 값을 0으로 설정.
- 이를 통해 "masters[0].monitor"의 체크 기능을 비활성화함.
3. 커버리지 기능 제어
(1) coverage_enable을 사용한 커버리지 기능 ON/OFF
- 커버리지 수집 기능을 필요에 따라 활성화 또는 비활성화 가능.
- 기본적으로 커버리지를 활성화하고, 특정 테스트에서만 비활성화할 수도 있음.
예제: coverage_enable을 이용한 커버리지 기능 제어
class master_monitor extends uvm_monitor;
bit coverage_enable = 1; // 기본값: 커버리지 활성화
`uvm_component_utils_begin(master_monitor)
`uvm_field_int(coverage_enable, UVM_ALL_ON)
`uvm_component_utils_end
covergroup cov_trans;
option.per_instance = 1;
// 커버리지 포인트 정의
coverpoint trans_collected.addr;
coverpoint trans_collected.data;
endgroup
function new(string name, uvm_component parent);
super.new(name, parent);
cov_trans = new();
endfunction
virtual protected task collect_transactions();
forever begin
@(posedge xmi.sig_clock);
... // 신호 수집
if (coverage_enable) // 커버리지 활성화 여부 확인
cov_trans.sample();
end
endtask
endclass
설명
- coverage_enable 비트 필드를 선언하여 커버리지 기능을 활성화/비활성화 가능.
- collect_transactions()에서 coverage_enable 값이 1일 때만 cov_trans.sample() 실행.
(2) uvm_config_db를 사용하여 coverage_enable 값 변경
- 테스트 환경에서 특정 모니터의 커버리지 기능을 OFF로 설정 가능.
예제: 특정 모니터(master0.monitor)의 커버리지 기능 OFF
uvm_config_db#(int)::set(this, "masters[0].monitor", "coverage_enable", 0);
설명
- "masters[0].monitor" 경로를 따라 coverage_enable 값을 0으로 설정.
- "masters[0].monitor"의 커버리지 수집 기능이 비활성화됨.
4. 체크 및 커버리지 기능을 테스트 수준에서 설정하는 방법
- 테스트(uvm_test) 클래스에서 체크 및 커버리지 기능을 설정 가능.
- 이를 통해 개별 테스트마다 체크 및 커버리지 활성화 여부를 다르게 설정 가능.
예제: base_test에서 체크 및 커버리지 설정
class base_test extends uvm_test;
`uvm_component_utils(base_test)
function new(string name = "base_test", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
// 체크 비활성화
uvm_config_db#(int)::set(this, "masters[0].monitor", "checks_enable", 0);
// 커버리지 비활성화
uvm_config_db#(int)::set(this, "masters[0].monitor", "coverage_enable", 0);
endfunction
endclass
설명
- 테스트 환경에서 특정 에이전트의 모니터링 기능을 제어할 수 있도록 설정.
- build_phase()에서 uvm_config_db를 이용하여 checks_enable과 coverage_enable 값을 변경 가능.
5. 요약
✅ 체크 및 커버리지를 제어할 수 있도록 checks_enable과 coverage_enable을 비트 필드로 선언.
✅ uvm_config_db를 활용하여 특정 컴포넌트의 체크 및 커버리지 기능을 개별적으로 ON/OFF 가능.
✅ 테스트(uvm_test) 환경에서 설정을 조정하여 테스트마다 체크 및 커버리지 기능을 다르게 설정 가능.
✅ 이러한 방식으로 필요할 때만 체크 및 커버리지를 활성화하여 시뮬레이션 성능을 최적화 가능.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.