지노랩 /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
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 5. Register Layer Class 사용하기' 카테고리의 다른 글
[UVM] 5.5.1 필드 타입(Field Type) ― 레지스터 필드를 객체로 “정의·제약·확장”하는 방법 (0) | 2025.05.07 |
---|---|
[UVM] 5.5 레지스터 모델 생성 — “Generator 작성자를 위한 실전 절차” (0) | 2025.05.06 |
[UVM] 5.4 커버리지 모델 – RAL 내부에서도 “무엇을 얼마나 덮었는가”를 보려면 (0) | 2025.05.06 |
[UVM] 5.2 레지스터 모델 사용 모델 – RAL(Register Abstraction Layer) 제대로 쓰는 법 (0) | 2025.05.05 |
[UVM] 5.1 UVM 레지스터 레이어 활용하기 (0) | 2025.05.04 |