[SystemVerilog 실무] 10. Assertion 이해 및 활용
본문 바로가기
지식 공유/SystemVerilog

[SystemVerilog 실무] 10. Assertion 이해 및 활용

by 긍수저 2025. 5. 10.
반응형

SystemVerilog Assertion(SVA)은 설계의 특정 동작이 올바르게 이루어지는지를 타이밍 기반으로 검증하는 도구입니다. Assertion은 시뮬레이션뿐 아니라 Formal Verification에서도 중요한 역할을 하며, 시스템의 신뢰성을 높이는 데 핵심적인 기술입니다.

Assertion의 개요

  • Assertion은 검증할 논리 조건과 조건 만족 여부에 따른 동작을 정의하는 구문입니다.
<label>: assert (<expression>)
            <pass_action>;
        else
            <fail_action>;
  • label은 assertion의 이름이며 디버깅 시 유용하게 사용됩니다.
  • pass_action에는 $display() 등, fail_action에는 $error()와 같은 메시지 출력이 주로 사용됩니다.

Assertion의 종류

Immediate Assertion

  • if 문처럼 즉시 실행되며 프로시저 블록 내에서 사용됩니다.
  • 예시:
assert (a == b) $display("Pass");
else $error("Fail");

Concurrent Assertion

  • 클럭 기반으로 여러 사이클에 걸쳐 동작을 검증합니다.
  • RTL 타이밍과 연동된 시퀀스를 정의할 수 있어 복잡한 시나리오에 적합합니다.
  • 예시:
property p;
  @(posedge clk) a |=> b;
endproperty
assert property(p);

Sequence 정의하기

  • 특정 신호 간의 시간적 관계를 정의하는 블록입니다.
  • 예시 문법:
sequence seq_name;
  @(posedge clk) condition1 ##delay condition2;
endsequence
  • ##N: condition1이 만족된 후 N 클럭 뒤 condition2가 발생해야 함을 의미

빌트인 메서드 활용법

  • $rose(signal) : 0→1 상승 에지 감지
  • $fell(signal) : 1→0 하강 에지 감지
  • $stable(signal) : 값이 변하지 않음을 확인
  • ##N : 정해진 클럭 사이클 지연
  • ##[M:N] : 유연한 클럭 범위 지연
  • |-> : Overlapping implication (즉시 후행 조건 필요)
  • |=> : Non-overlapping implication (다음 사이클 후행 조건 필요)
System Task / Function 설명 예제
$assertoff Assertion 비활성화 $assertoff; (전체 비활성화)
$fatal 시뮬레이션 종료 $fatal(1, "Critical Error");
$error 일반 오류 메시지 출력 $error("Test failed");
$warning 경고 메시지 출력 $warning("Potential issue detected");
$info 정보 메시지 출력 $info("Simulation started");
$onehot(expression) 표현식에서 단 하나의 비트만 1인지 검사 assert ($onehot(state));
$isunknown(expression) 표현식이 X 또는 Z인지 검사 assert (!$isunknown(signal));
$countones(expression) 표현식에서 1의 개수 반환 int num_ones = $countones(signal);

Assertion 제어: disable iff

  • 특정 조건일 때 assertion을 비활성화시켜 false fail을 방지합니다.
  • 주로 reset 조건에 사용됩니다.
  • 예시:
property p_example;
  @(posedge clk) disable iff (reset) (req |=> ack);
endproperty

Deep Talk: Assertion Bind

  • RTL 수정 없이 assertion이나 monitor 등을 삽입할 수 있는 기법입니다.
  • 모든 인스턴스에 bind:
bind DUT monitor mon_inst (...);
  • 특정 인스턴스에만 bind:
bind u_dut monitor mon_inst (...);

 

 

반응형

댓글