지노랩 /JinoLab
[UVM] 5.6.1 read/write(UVM_BACKDOOR) vs. peek/poke() — 차이와 올바른 사용법 본문
UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기
[UVM] 5.6.1 read/write(UVM_BACKDOOR) vs. peek/poke() — 차이와 올바른 사용법
지노랩/JinoLab 2025. 5. 11. 09:30방법 호출 예 백도어 동작 레지스터 동작 규칙(CLR-on-RD, RO, W1C 등) 미러 갱신 주용도
| read / writepath = UVM_BACKDOOR | sv<br>R_CTRL.read(status, data, .path(UVM_BACKDOOR));<br>R_CTRL.write(status, data, .path(UVM_BACKDOOR)); | 내부 신호에 직접 접근하지만 프런트도어와 동일한 기능적 효과를 흉내 냄 | ● O (모사)· read CLR-on-RD 비트 → 0 poke· write RO/W1C 비트 → 값 유지 등 | O (predict/샘플) | 빠른 시뮬 + 기능 보존(가장 많이 사용) |
| peek / poke | sv<br>R_CTRL.peek(status, data);<br>R_CTRL.poke(status, 32'hDEAD_BEEF); | 값 그대로 샘플·디폿 | ● X (무시)CLR-on-RD도 변경되지 않음RO·W1C도 덮어써짐 | O (raw 값으로 업데이트) | 디버그, 초기 메모리 로딩, 강제 패치 |
핵심 차이
- 기능적 모사 여부
- read/write + UVM_BACKDOOR → 프런트도어와 같은 부작용을 흉내
- peek/poke → 단순 bit-bang, 모든 보호 규칙 무시
- 결과 차이 예시상황 read/backdoor peek
CLR-on-RD 비트 값 읽힌 뒤 0으로 자동 클리어 0으로 클리어되지 않음 RO 비트에 write 기존 값 유지 원하는 값으로 강제 덮어씀 - 미러(prediction) 연동
두 방법 모두 내부적으로 미러 값을 갱신하지만, peek/poke 는 “raw” 값을 반영하므로 HW 실제 동작과 다를 수 있음.
실무 사용 가이드
목적 권장 API
| 기능 검증을 그대로 유지하면서 속도 향상 | read/write(..., UVM_BACKDOOR) |
| 초기 설정 수천 개 레지스터 0-time 구성 | reg_blk.update(UVM_BACKDOOR) 또는 set()+update(BACKDOOR) |
| RAM/FIFO 대량 로딩·추출 | mem.poke() / mem.peek() (스크립트 기반) |
| 특정 버그 원인 파악·값 강제 수정 | poke() 후 파형 관찰 |
| CLR-on-RD 동작 자체를 테스트 | 반드시 프런트도어 read → backdoor peek 으로 결과 확인 |
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 5. Register Layer Class 사용하기' 카테고리의 다른 글
| [UVM] 5.6.3 VPI-기반 백도어 액세스 ― “UVM 기본 백도어가 내부적으로 하는 일과, 시뮬레이터 설정 방법” (0) | 2025.05.12 |
|---|---|
| [UVM] 5.6.2 계층적 HDL 경로(Hierarchical HDL Path) ― 백도어가 레지스터를 “찾아가는” 길 표시하기 (0) | 2025.05.11 |
| [UVM] 5.6 백도어 액세스 ― “버스 안 타고 바로 레지스터를 두드려라” (0) | 2025.05.10 |
| [UVM] 5.5.7 데이터 폭 한계 — uvm_reg_data_t를 64 비트 이상으로 늘리고 싶을 때 (0) | 2025.05.10 |
| [UVM] 5.5.6 레지스터 모델 패키징 ― 컴파일·재사용을 쉽게 하는 소스 구조 권장안 (0) | 2025.05.09 |