Systemverilog -> force, release, deposit 기능에 대하여
🎮 SystemVerilog force, release, deposit 완벽 가이드
테스트벤치 시그널 제어의 모든 것 — 검증 엔지니어를 위한 실전 레퍼런스
검증 중 특정 시그널을 강제로 제어하거나, 에러를 주입하거나, DUT 내부 상태를 조작해야 할 때가 있습니다. force, release, deposit은 이런 상황에서 강력한 도구입니다. 이 글에서는 각 명령어의 동작 원리부터 실전 활용 패턴까지, 파형 시각화와 함께 상세히 설명합니다.
🎯 1. 개요 및 사용 목적
검증 과정에서 시그널 제어가 필요한 상황들입니다.
• 에러 주입 (Error Injection): 정상 동작 중 강제로 에러 상태 만들기
• 코너 케이스 테스트: 특정 조건을 강제로 생성
• 초기화 우회: 긴 초기화 시퀀스를 건너뛰기
• 디버깅: 특정 값에서 동작 관찰
• X 상태 제거: 시뮬레이션 초기 X 값 해결
💪 2. force 명령어
force는 시그널의 모든 드라이버를 무시하고 지정한 값을 강제합니다.
• 최고 우선순위: 어떤 드라이버보다 우선
• 영구 지속: release 전까지 유지
• 대상: wire, reg, logic 모두 가능
기본 문법
실전 예제: 리셋 강제
🔓 3. release 명령어
release는 force의 효과를 제거하고, 원래 드라이버에게 제어권을 반환합니다.
• 반드시 짝으로 사용: force 후 release 필수!
• 즉시 효과: release 순간 원래 드라이버 값으로 복귀
• force 없이 release: 아무 효과 없음 (에러 아님)
기본 문법
force/release 짝 패턴
📥 4. deposit 명령어
$deposit은 값을 주입하지만 원래 드라이버를 제거하지 않습니다.
• 일시적 효과: 다음 드라이버 이벤트에서 덮어씌워짐
• 드라이버 유지: 원래 드라이버가 계속 동작
• release 불필요: 자동으로 원래 값으로 복귀
• 주 용도: X 상태 초기화, 일시적 값 설정
기본 문법
X 상태 제거 예제
⚖️ 5. force vs deposit 비교
| 특성 | force | $deposit |
|---|---|---|
| 동작 | 드라이버 완전 무시 | 값만 주입, 드라이버 유지 |
| 우선순위 | 최고 (모든 드라이버보다 우선) | 낮음 (드라이버가 즉시 덮어씀) |
| 지속 시간 | release 전까지 영구 | 다음 드라이버 이벤트까지 |
| 해제 필요 | ✅ release 필수 | ❌ 불필요 |
| 주 용도 | 에러 주입, 상태 강제 | X 초기화, 일시적 값 설정 |
| 문법 | force sig = val; | $deposit(sig, val); |
💪 force 사용 시점
• 특정 값을 유지해야 할 때
• DUT 로직을 무시해야 할 때
• 에러 상태를 지속시킬 때
• 긴 시간 동안 제어할 때
📥 $deposit 사용 시점
• X 상태 초기화할 때
• 일시적 값 주입할 때
• DUT 로직 흐름을 유지할 때
• 메모리 프리로드할 때
🔗 6. 계층적 경로 접근
DUT 내부 시그널에 접근하려면 계층적 경로(Hierarchical Path)를 사용합니다.
• private 시그널: 합성 후 최적화로 사라질 수 있음
• generate 블록: 인덱스 포함 경로 사용
• 시뮬레이터 차이: VCS, Xcelium, Questa 동작이 다를 수 있음
📈 7. 타이밍 다이어그램
force/release의 동작을 시각적으로 이해합니다.
🔧 8. 실전 활용 패턴
패턴 1: Error Injection
패턴 2: 초기화 우회
패턴 3: 코너 케이스 테스트
패턴 4: 메모리 프리로드
🏗️ 9. UVM에서의 활용
• Virtual Interface 활용: 계층 경로 대신 vif 사용 권장
• Config DB: 경로를 하드코딩하지 않고 Config DB로 관리
• Sequence 내 force: 시퀀스 종료 전 반드시 release
• Reset Phase: reset_phase에서 초기화 용도로 활용
🎯 10. 모범 사례 및 주의사항
1. 항상 force/release 짝으로: force 후 반드시 release
2. 로깅 추가: force/release 시점 기록
$display("[%0t] Force applied", $time);
3. Task로 캡슐화: 재사용성 향상
4. 조건부 해제: 시뮬레이션 종료 시에도 해제되도록
5. 명확한 네이밍: force용 task에 명확한 이름 사용
1. release 누락: 시뮬레이션 전체에 영향
2. 하드코딩 경로: 구조 변경 시 모든 경로 수정 필요
3. 타이밍 고려 안 함: 클럭 에지 정렬 없이 force
4. 과도한 사용: 실제 DUT 동작 검증이 아닌 우회로 전락
5. 문서화 없음: 왜 force가 필요한지 주석 없음
시뮬레이터별 주의사항
| 시뮬레이터 | 주의사항 |
|---|---|
| VCS | 비트 슬라이스 force 지원, generate 경로 주의 |
| Xcelium | $deposit 동작이 다를 수 있음, 로그 레벨 확인 |
| Questa | force 충돌 시 경고 메시지, GUI 디버깅 지원 |
| Verilator | force/deposit 미지원! PLI 사용 필요 |
📌 핵심 요약
| 명령어 | 동작 | 해제 | 용도 |
|---|---|---|---|
| force | 드라이버 완전 무시 | release 필수 | 에러 주입, 상태 강제 |
| release | force 해제 | - | 원래 드라이버로 복귀 |
| $deposit | 일시적 값 주입 | 불필요 | X 초기화, 메모리 로드 |
황금률: force는 강력하지만 위험합니다. 항상 release와 짝으로, 최소한으로, 문서화와 함께 사용하세요!
• IEEE 1800-2017 SystemVerilog LRM, Section 10.6 (force/release)
• Synopsys VCS User Guide - Signal Force Commands
• Cadence Xcelium User Guide - Simulation Control
• UVM Cookbook - Debugging Techniques
댓글
댓글 쓰기