지노랩 /JinoLab

[UVM] 5.3 Access API ― 레지스터/필드 값을 다루는 5 가지 패턴과 올바른 사용법 본문

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

[UVM] 5.3 Access API ― 레지스터/필드 값을 다루는 5 가지 패턴과 올바른 사용법

지노랩/JinoLab 2025. 5. 5. 12:02

 

메서드 DUT 접근 미러 동작 주용도·특징

read() / write() Front-door(버스 BFM) 또는 Back-door(peek/poke 흉내) 수행 후 자동 예측(predict) ■ 일반 테스트에서 표준 R/W■ CnR·W1C 규칙까지 모사
peek() / poke() Back-door 직접 샘플·디폿 후 미러 갱신 ■ 속도↑ (0 cycle)■ 초기화·장비 Bring-up
get() / set() DUT 미접근 미러 값만 조회·수정 ■ 빠른 설정 후 update() 로 일괄 반영
randomize() DUT 미접근 post_randomize()로 미러-Desired 값 설정 ■ 랜덤 RAL 시퀀스 작성 시 편리
update() Desired ≠ Mirrored 일 때 write() 호출 완료 후 미러=Desired ■ DUT를 미러 값과 동기화
mirror() read() 수행 (front/back) 읽어온 값으로 미러 갱신 (+옵션 비교) ■ DUT→모델 싱크, SW↔HW 비교

5.3.1 read / write

codec.CONFIG.ADDR.write(status, 8'h55, .parent(this),
                         .path(UVM_FRONTDOOR));   // 버스 R/W
codec.CONFIG.ADDR.read(status,  addr);
  • front-door : 버스 트랜잭션 발생 → 모니터가 관측 → 미러 예측
  • back-door : 내부 peek/poke 흉내(클리어-온-리드 규칙 반영)

5.3.2 peek / poke

codec.CONFIG.peek(status, reg_val);              // 0-time
codec.CONFIG.poke(status, 32'hDEAD_BEEF);
  • 실제 RTL 신호를 직접 접근 → 가장 빠름
  • 부작용 규칙(Clr-on-Rd 등) 모사하지 않음 → Bring-up, 디버그용

5.3.3 get / set + update

codec.CONFIG.set(32'h0000_0123); // 미러 Desired만 변경
codec.CONFIG.update(status);     // 변경된 레지스터만 Write
  • 다수 레지스터를 0-time으로 셋업 후 block.update() 한 번에 적용 → 불필요한 버스 싸이클 절감

5.3.4 randomize

codec.randomize() with { CONFIG.ADDR inside {[0:255]}; };
codec.update(status);
  • post_randomize() 단계서 Desired 값으로 이동
  • 커버리지 드리븐 랜덤 시퀀스 구현 시 편리

5.3.5 mirror

codec.mirror(status, UVM_CHECK); // 읽고 이전 미러값과 비교
  • UVM_CHECK : 불일치 시 uvm_error 리포트
  • UVM_NOP : 비교 없이 미러만 갱신

5.3.6 동시 접근(Concurrency) 주의

  • 각 uvm_reg 안에 세마포어 1개 → 한 스레드씩 직렬화
  • 블록킹 대기 → 타 스레드 작업 완료 후 순차 진행
  • 스레드를 kill 했다면 reg.reset() 으로 세마포어 해제 필수

실무 Best Practice

시나리오 추천 API

SoC 초기 레지스터 설정 set() → block.update(BACKDOOR)
기능 시뮬 범용 테스트 read()/write() (FRONTDOOR)
빠른 파라미터 스윕 randomize() + update(BACKDOOR)
DUT 상태 스냅샷 mirror(BACKDOOR)
단기 디버그, 파형만 보고 싶음 peek()/poke()


 

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