지노랩 /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:381 | 왜 “직접 만든” 백도어가 필요한가?
문제 상황 기본 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
- 상태 코드 설정
- rw.status = UVM_IS_OK; // 성공 rw.status = UVM_NOT_OK; // 실패 시
- 트랜잭션 추적용 uvm_info
- `uvm_info("BKDR", $sformatf("%s wrote %08x", rw.element.get_name(), data), UVM_HIGH)
- 동일 데이터 유지
- write 후 mirror predict 를 맞추려면
rw.element.predict(data, .kind(UVM_PREDICT_DIRECT)) 호출
- write 후 mirror predict 를 맞추려면
- 블록 전체 공통 백도어
- 여러 레지스터를 동일 API로 처리할 때 block.set_backdoor(new bk) 일괄 등록
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.