지노랩 /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:36

 

1 | 기본 동작 원리

  1. HDL 경로 취득
    • 각 레지스터/메모리 인스턴스는로 완전한 계층 경로를 돌려준다. (앞 절 5.6.2에서 설정해 둔 조각들을 “.”로 연결)
    • string hdl_path = reg.get_full_hdl_path();
  2. VPI 함수 호출
    • UVM 라이브러리(C side)가 표준 SystemVerilog VPI API
      (vpi_handle_by_name, vpi_get_value, vpi_put_value …) 를 사용해 해당 신호에 샘플(읽기) / 디폿(쓰기) 을 수행한다.
  3. 조건
    • 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 | 실무 팁

  1. 시뮬 단계 구분
    • 초기 설정/스냅샷 : Back-door + VPI (0-time)
    • 기능/타이밍 검증 : Front-door 전용, +disable_vpi 재빌드 없이 스위치
  2. 속도 비교 후 결정
    • 작은 IP → VPI 오버헤드 << 레지스터 트래픽 → 백도어 상시 ON
    • 대형 SoC → 초기화만 백도어, 이후 VPI 언로드 (dpi_close())
  3. 경로 자동 검증
    • 시뮬 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
를 바탕으로 작성된 글입니다.