지노랩 /JinoLab
[UVM] 5.2 레지스터 모델 사용 모델 – RAL(Register Abstraction Layer) 제대로 쓰는 법 본문
UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기
[UVM] 5.2 레지스터 모델 사용 모델 – RAL(Register Abstraction Layer) 제대로 쓰는 법
지노랩/JinoLab 2025. 5. 5. 09:00
5.2 Usage Model 개요
용어 의미
| Block(uvm_reg_block) | DUT 계층의 IP 블록·서브시스템에 대응. 하나 이상의 레지스터/메모리/서브 Block 포함 |
| Reg File(uvm_reg_file) | 레지스터들을 논리적으로 묶은 그룹(배열) |
| Register(uvm_reg) | 하나 이상의 Field(비트 구간)를 갖는 객체 |
| Field(uvm_reg_field) | 실제 하드웨어 비트들과 1:1 매핑되는 최소 단위 |
| Memory(uvm_mem) | 주소가 큰 RAM/CAM/FIFO 등 |
모든 요소는 클래스 인스턴스로 제공되며, read()/write() 메서드만 호출하면 실제 버스 어드레스·랜 등은 자동 처리된다.
클래스 협업 구조



5.2.1 필드 단위(Sub-register) 접근

- 버스가 Byte-Enable 지원 + 필드가 바이트 경계를 단독 점유 ⇒ 단일 사이클 접근 가능
- 그렇지 않으면 peek-modify-poke(read-modify-write)로 전체 레지스터를 핸들링 → 부작용 위험
- 지원 조건
- 모델 생성기가 field.configure()에서 byte_lane 단독 플래그 설정
- uvm_reg_adapter::supports_byte_enable = 1
- Front-door 경로일 때만 적용 (Back-door는 항상 전체 레지스터 단위)
5.2.2 미러(Mirror) 메커니즘
동작 메서드 설명
| DUT→모델 값 동기화 | mirror(CHK, UVM_FRONTDOOR/BACKDOOR) | 실제 읽어서 미러 업데이트 |
| 모델 값 갱신(0-time) | set() | 시뮬 0 시간에 미러만 수정 |
| 모델→DUT 적용 | update() | 변경된 필드/블록만 실제 버스 Write |
| 미러값 조회 | get() | 0-time으로 현재 미러 값 반환 |
- 미러는 예측(prediction) 역할이지, 스코어보드가 아님 – DUT가 내부적으로 값을 변경하면 반드시 mirror()로 다시 읽어와야 정확해진다.
- 대규모 블록 mirror()/update()는 Back-door가 훨씬 빠르므로 초기 config에 권장.
5.2.3 메모리는 미러링하지 않는다
- 메모리 용량이 크므로 스파스 배열로만 저장 (쓰기 주소만 보존).
- 실제 값 조회/갱신은 uvm_mem::peek() / poke()가 Back-door로 직접 수행 → 별도 미러 불필요.
- 따라서 RAL 메모리 검증 시에는 표준 RAL 메모리 시퀀스 + peek/poke만으로 충분.
사용 예시 – 코드 한 줄로 접근
// CONFIG 레지스터의 ADDR 필드 읽기
rand bit [7:0] addr;
codec.CONFIG.ADDR.read(status, addr);
// BFR 메모리 7번 주소에 값 쓰기
codec.BFR.write(status, 7, 32'hDEAD_BEEF);
// 필드 별칭(alias) 활용 – ADDR 위치가 바뀌어도 영향 無
codec.ADDR.write(status, 8'h55);
- 필드 이름이 블록 내 유니크하면 alias를 통해 codec.ADDR 형태 접근 가능 → RTL에서 위치가 변해도 테스트 불변.
- Alias 선언은 모델 생성기가 옵션으로 자동 생성.
실무 체크리스트
체크 권장 행동
| 모델 생성 | IP-XACT, CSV, YAML→Perl/Python 스크립트로 자동 생성 |
| 다중 인터페이스 | uvm_reg_map 여러 개 (AXI_map, APB_map) 정의 후 add_hdl_path_slice() 로 Back-door 추가 |
| Reset 검증 | uvm_reg_hw_reset_seq & uvm_mem_hw_reset_seq 즉시 활용 |
| 적용 시점 | build_phase에서 모델 인스턴스화, connect_phase에서 어댑터 연결 |
| 성능 최적화 | 초기 설정 후 model.lock_model() → 시뮬 중 구조 변경 방지 |
본 내용은
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.3 Access API ― 레지스터/필드 값을 다루는 5 가지 패턴과 올바른 사용법 (0) | 2025.05.05 |
| [UVM] 5.1 UVM 레지스터 레이어 활용하기 (0) | 2025.05.04 |