지노랩 /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:10

 

1. 개요

  • 인터페이스에서 체크는 어서션(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
를 바탕으로 작성된 글입니다.