지노랩 /JinoLab
[UVM] 5.6.3 VPI-기반 백도어 액세스 ― “UVM 기본 백도어가 내부적으로 하는 일과, 시뮬레이터 설정 방법” 본문
UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기
[UVM] 5.6.3 VPI-기반 백도어 액세스 ― “UVM 기본 백도어가 내부적으로 하는 일과, 시뮬레이터 설정 방법”
지노랩/JinoLab 2025. 5. 12. 09:361 | 기본 동작 원리
- HDL 경로 취득
- 각 레지스터/메모리 인스턴스는로 완전한 계층 경로를 돌려준다. (앞 절 5.6.2에서 설정해 둔 조각들을 “.”로 연결)
- string hdl_path = reg.get_full_hdl_path();
- VPI 함수 호출
- UVM 라이브러리(C side)가 표준 SystemVerilog VPI API
(vpi_handle_by_name, vpi_get_value, vpi_put_value …) 를 사용해 해당 신호에 샘플(읽기) / 디폿(쓰기) 을 수행한다.
- UVM 라이브러리(C side)가 표준 SystemVerilog VPI API
- 조건
- HDL 경로 문자열이 정상적인 SystemVerilog 변수/배열/슬라이스 형태여야 한다.
- 그렇다면 추가 사용자 코드 없이 백도어 읽기/쓰기가 동작한다.
2 | DPI-C 라이브러리 연결
단계 일반적인 명령어 예 비고
| ① 컴파일 | gcc -fPIC -shared -o libuvm_backdoor.so uvm_dpi.c | 시뮬레이터 제공 uvm_dpi.c 소스 사용 |
| ② 시뮬 옵션 | ``` | |
| vcs tb_top.sv \ |
-CFLAGS "-fPIC" \
-load ./libuvm_backdoor.so
``` | Questa/Incisive 등은 -sv_lib 또는 -dpi_lib 옵션 |
시뮬레이터마다 파일 이름·옵션이 다르므로,
벤더 제공 “UVM DPI/PLI 사용 설명서” 를 반드시 참고하세요.
3 | 성능 주의 사항
이슈 원인 대응
| 시뮬 속도 하락 | VPI 가 켜지면 정적 최적화(넷리스트 인라인, 신호 폴딩 등) 비활성화될 수 있음 | * 벤더 가이드의 “VPI Opt-On” 스위치 사용* 백도어 단계에서만 VPI 로드, 나머지 테스트에선 비활성화 |
| 대량 백도어 트래픽 | 반복적 VPI 호출 자체가 느림 | * 가능하면 read()/write(UVM_BACKDOOR) 대신 peek()/poke() 를 배치 호출(메모리 블록 단위)* DPI 전용 함수로 “배열 일괄 접근 API” 제공되는지 확인 |
| 멀티스레드 시뮬 | 일부 시뮬레이터는 VPI 사용 시 single-thread 제한 | * thread 제한 옵션 해제 불가 ⇒ 백도어 구간만 줄여 속도 확보 |
4 | 실무 팁
- 시뮬 단계 구분
- 초기 설정/스냅샷 : Back-door + VPI (0-time)
- 기능/타이밍 검증 : Front-door 전용, +disable_vpi 재빌드 없이 스위치
- 속도 비교 후 결정
- 작은 IP → VPI 오버헤드 << 레지스터 트래픽 → 백도어 상시 ON
- 대형 SoC → 초기화만 백도어, 이후 VPI 언로드 (dpi_close())
- 경로 자동 검증
- 시뮬 0 시간에
- if (reg.get_full_hdl_path() == "") `uvm_fatal("HDL_PATH","Missing back-door path");
- 잘못된 문자열은 vpi_handle_by_name 이 NULL 반환 → 바로 에러 체크.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.