지노랩 /JinoLab

[UVM] 5.6.4 사용자-정의 백도어(User-defined Back-door) ― 직접 만든 API로 암호화 IP·특수 구조를 두드리는 법 본문

UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기

[UVM] 5.6.4 사용자-정의 백도어(User-defined Back-door) ― 직접 만든 API로 암호화 IP·특수 구조를 두드리는 법

지노랩/JinoLab 2025. 5. 12. 11:38

 

1 | 왜 “직접 만든” 백도어가 필요한가?

문제 상황 기본 VPI 백도어 한계

암호화 IP — 내부 신호명이 가려져 있음 HDL path 기반 VPI가 신호를 찾지 못함
다른 언어/PLI — 모델이 C-model · SystemC로 작성 순수 SV VPI로는 접근 불가
툴 제공 전용 API — 예: $mti, $pli_mempeek 기본 백도어는 호출 불가
관측/변환 로직 포함 — ECC를 우회해 데이터만 쓰고 싶음 슬라이스 조합만으로는 부족

사용자-정의(backdoor) 클래스를 만들어 원하는 방식으로 read / write 를 구현-주입.


2 | 레지스터용 백도어 클래스 구현

class enc_reg_bkdr extends uvm_reg_backdoor;
  // (옵션) 암호화 라이브러리 핸들
  extern virtual task write(uvm_reg_item rw);
  extern virtual task read (uvm_reg_item rw);
endclass

// ---------- 쓰기 ----------
task enc_reg_bkdr::write(uvm_reg_item rw);
  // rw.value[0] 에 원하는 데이터가 들어있음
  bit [31:0] data = rw.value[0];
  // 암호화 모델용 API 예시
  my_enc_api_wr(rw.element.get_full_name(), data);
endtask

// ---------- 읽기 ----------
task enc_reg_bkdr::read(uvm_reg_item rw);
  bit [31:0] data;
  my_enc_api_rd(rw.element.get_full_name(), data);
  rw.value[0] = data;        // RAL에 전달
endtask
  • rw.element : 현재 접근 중인 uvm_reg 인스턴스
  • rw.value[] : 값 전달 버퍼
  • 반드시 rw.status 를 UVM_IS_OK / UVM_NOT_OK 등으로 설정하거나 기본값 유지

3 | 레지스터-모델에 백도어 연결하기

3-1 블록/레지스터 타입 내부(build 단계)

virtual function build();
  super.build();
  enc_reg_bkdr bk = enc_reg_bkdr::type_id::create("bk");
  R_CTRL.set_backdoor(bk);    // 특정 레지스터
  // 또는 블록 전체:
  // this.set_backdoor(bk);
endfunction

3-2 환경에서 후-등록(override)

function void build_phase(uvm_phase phase);
  super.build_phase(phase);
  enc_reg_bkdr bk = new;
  regmodel.R_CTRL.set_backdoor(bk);  // 이전 설정을 덮어씀
endfunction
  • 언제든 override 가능 — 모델 생성기-내 정의 → TB 단계에서 교체

4 | 메모리용 백도어

class mem_bank_bkdr extends uvm_mem_backdoor;
  virtual task write(uvm_reg_item rw);
    my_mem_api_poke(rw.offset, rw.value[0]);
  endtask

  virtual task read(uvm_reg_item rw);
    rw.value[0] = my_mem_api_peek(rw.offset);
  endtask
endclass

// 연결
mem_bank_bkdr bk = new;
regmodel.MEM_BUF.set_backdoor(bk);

5 | 장단점 정리

항목 사용자-정의 백도어 기본 VPI 백도어

지원 대상 암호화, SystemC, 전용 C-모델 등 모두 가능 SV 변수만
개발 난이도 직접 클래스·API 작성 자동
성능 API 구현에 따라 ↑/↓ 일반적으로 빠름
유지보수 RTL 계층 변경 영향 없음 (API 내부 처리) HDL path 수정 필요

6 | 실무 TIP

  1. 상태 코드 설정
  2. rw.status = UVM_IS_OK; // 성공 rw.status = UVM_NOT_OK; // 실패 시
  3. 트랜잭션 추적용 uvm_info
  4. `uvm_info("BKDR", $sformatf("%s wrote %08x", rw.element.get_name(), data), UVM_HIGH)
  5. 동일 데이터 유지
    • write 후 mirror predict 를 맞추려면
      rw.element.predict(data, .kind(UVM_PREDICT_DIRECT)) 호출
  6. 블록 전체 공통 백도어
    • 여러 레지스터를 동일 API로 처리할 때 block.set_backdoor(new bk) 일괄 등록


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.