지노랩 /JinoLab
[UVM] 3.12.2 인터페이스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Interfaces) 본문
UVM(Universal Verification Methodology)/3. 재사용 가능한 검증 컴포넌트 개발(Developing Reusabl
[UVM] 3.12.2 인터페이스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Interfaces)
지노랩/JinoLab 2025. 3. 22. 12:101. 개요
- 인터페이스에서 체크는 어서션(assertion) 기반으로 구현됨.
- 프로토콜 신호(activity)를 검증하기 위해 어서션을 추가.
- DUT(Device Under Test)와 직접 연결되는 물리적 인터페이스의 신호 상태를 확인.
- UVM 환경(env)에서 사용하는 인터페이스에 어서션을 추가하여 특정 프로토콜 위반을 감지.
- 예제: 유효한 전송(valid transfer) 중 주소(address) 값이 X 또는 Y가 되는지 검사.
- 인터페이스 체크에는 assert와 assume 두 가지 유형이 있음:
- assert: DUT의 동작을 검증할 때 사용.
- assume: DUT가 아닌, 테스트 환경(stimulus generator)의 동작을 가정할 때 사용.
2. 인터페이스에서 어서션을 사용한 체크
(1) 어서션 기반의 신호 체크
- 프로토콜 위반을 감지하기 위해 assert를 사용.
- 테스트 환경이 특정 신호 조건을 만족하는지 검증하기 위해 assume를 사용.
예제: 유효한 전송 중 주소 값이 X 또는 Y가 되는지 검증
interface bus_if (input logic clk);
logic valid, ready;
logic [31:0] addr, data;
// 어서션: 유효한 전송(valid transfer) 중 주소(addr)는 X 또는 Z가 되면 안 됨
property addr_not_x_or_z;
@(posedge clk) disable iff (!valid)
valid |-> !(^addr === 1'bx) && !(^addr === 1'bz);
endproperty
assert property (addr_not_x_or_z)
else `uvm_error("ASSERTION", "주소 값이 X 또는 Z가 됨!");
// 어서션: 유효한 전송에서 데이터 값이 유효해야 함
property data_valid;
@(posedge clk) disable iff (!valid)
valid && ready |-> $stable(data);
endproperty
assert property (data_valid)
else `uvm_error("ASSERTION", "유효한 전송 중 데이터 변경 감지됨!");
endinterface
설명
- 어떤 조건에서 신호를 검증할 것인지 명확하게 지정.
- property addr_not_x_or_z:
- 유효한 전송(valid == 1) 동안 주소 값(addr)이 X 또는 Z가 되어선 안 됨.
- ^addr === 1'bx: addr의 값이 X인지 확인.
- ^addr === 1'bz: addr의 값이 Z인지 확인.
- valid |-> !(^addr === 1'bx) && !(^addr === 1'bz): valid 신호가 1일 때, 주소가 X 또는 Z이면 에러 출력.
- property data_valid:
- 유효한 전송(valid && ready) 동안 데이터(data) 값이 변하지 않아야 함.
- $stable(data): data 값이 변하지 않았는지 체크.
(2) assume를 사용하여 테스트 환경을 가정
- 테스트 환경이 특정 조건을 만족한다고 가정할 경우 assume 사용.
- 예를 들어, DUT가 valid가 1이면 ready가 1이어야 한다고 가정.
예제: valid가 1이면 ready가 반드시 1이어야 함
property valid_requires_ready;
@(posedge clk) valid |-> ready;
endproperty
assume property (valid_requires_ready);
설명
- valid 신호가 1일 때 ready 신호도 1이어야 한다는 가정.
- 이러한 assume는 DUT의 입력 신호에 대한 기대 동작을 명시.
3. 인터페이스에서 커버리지 구현
(1) 커버리지 수집을 위한 cover 사용
- 인터페이스에서 cover를 사용하여 특정 이벤트 발생 빈도를 측정 가능.
- 예를 들어, 특정 조건에서 valid 신호가 활성화되는지 확인.
예제: valid 신호 활성화 커버리지
covergroup cg_valid @ (posedge clk);
option.per_instance = 1;
valid_transition : coverpoint valid;
endgroup
설명
- cg_valid 커버그룹은 클럭 상승 엣지에서 valid 신호의 활성화를 기록.
- valid_transition: valid가 1이 되는 순간을 커버포인트로 설정.
(2) 커버리지 크로스 체크
- 두 개 이상의 신호 조합을 확인할 때 크로스 커버리지 사용 가능.
예제: valid와 ready 신호의 크로스 커버리지
covergroup cg_valid_ready @ (posedge clk);
option.per_instance = 1;
valid_cp : coverpoint valid;
ready_cp : coverpoint ready;
valid_ready_cross : cross valid_cp, ready_cp;
endgroup
설명
- valid와 ready 신호의 다양한 조합을 측정하여 커버리지 분석 가능.
- valid_ready_cross: valid와 ready의 모든 가능한 조합을 기록.
4. 체크 및 커버리지 활성화/비활성화 방법
(1) 어서션 체크 활성화/비활성화
- UVM 환경에서 어서션을 제어할 수 있도록 설정 가능.
- 특정 조건에서 체크를 활성화하거나 비활성화하려면 ifdef 또는 UVM 설정을 사용할 수 있음.
예제: 어서션 체크 활성화/비활성화
`ifdef ENABLE_ASSERTIONS
assert property (addr_not_x_or_z);
assert property (data_valid);
`endif
설명
- ENABLE_ASSERTIONS 매크로가 정의되었을 때만 어서션이 활성화됨.
(2) 커버리지 활성화/비활성화
- 커버리지 활성화 여부를 선택할 수 있도록 설정 가능.
예제: 커버리지 활성화/비활성화
`ifdef ENABLE_COVERAGE
initial begin
cg_valid.start();
cg_valid_ready.start();
end
`endif
설명
- ENABLE_COVERAGE가 정의되어 있을 때만 커버리지 수집이 활성화됨.
5. 요약
- 인터페이스에서 체크 및 커버리지는 어서션(assert)과 cover를 사용하여 구현.
- 테스트 환경에서의 가정(assumption)은 assume을 사용하여 정의 가능.
- assert property를 사용하여 신호 상태를 확인하고, 오류 발생 시 uvm_error 출력.
- 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.1 클래스에서 체크 및 커버리지 구현 (Implementing Checks and Coverage in Classes) (0) | 2025.03.21 |
| [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 |