반응형
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 (...);
반응형
'지식 공유 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog 실무] 9. Functional Coverage의 이해 (0) | 2025.05.10 |
---|---|
[SystemVerilog 실무] 8. Package와 Interface (0) | 2025.05.10 |
[SystemVerilog 실무] 7. 랜덤 테스트와 Constraints 기초 (0) | 2025.05.10 |
[SystemVerilog 실무] 6. SystemVerilog OOP: 캡슐화, 상속, 다형성 (0) | 2025.05.10 |
[SystemVerilog 실무] 5. SystemVerilog 클래스 기초 완전정복 (0) | 2025.05.10 |
[SystemVerilog 실무] 4. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
댓글