지노랩 /JinoLab
[UVM] 5.11 레지스터-라이브러리에서 제공하는 사전 정의(Pre-defined) 시퀀스 활용 가이드 본문
UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기
[UVM] 5.11 레지스터-라이브러리에서 제공하는 사전 정의(Pre-defined) 시퀀스 활용 가이드
지노랩/JinoLab 2025. 5. 21. 11:21
1 | 개요
- 레지스터 모델을 환경에 인스턴스하고 버스/모니터와 통합한 뒤,
아래 테스트 시퀀스를 실행하면 DUT 레지스터·메모리의 기본 동작을 자동으로 검증할 수 있습니다. - 가장 단순한 uvm_reg_hw_reset_seq 부터 시작해 모델·환경·트랜잭터의 연결이 정상인지 먼저 확인하세요.
- 일부 시퀀스는 백도어(back-door) 접근이 필수입니다. (표에 표시)
2 | 주요 시퀀스 한눈에 보기
분류 시퀀스 이름 주요 검증 내용 요구 사항 / 제외용 Attribute
| 하드웨어 리셋 | uvm_reg_hw_reset_seq | 모든 레지스터를 읽어 리셋값 비교 | NO_REG_HW_RESET_TESTNO_REG_TESTS |
| 비트 바시(bash) | uvm_reg_bit_bash_seq → 내부에서 uvm_reg_single_bit_bash_seq 호출 | 각 비트를 0/1로 토글해 접근 정책(RW/RO 등) 확인 | NO_REG_BIT_BASH_TESTNO_REG_TESTS |
| 액세스 패스 검증 | uvm_reg_access_seq → 내부에서 uvm_reg_single_access_seq 호출 | • 앞-도어(버스) 쓰기 → 백도어 읽기 확인• 백도어 쓰기 → 버스 읽기 확인 | 백도어 필요NO_REG_ACCESS_TEST |
| 메모리 워킹 패턴 | uvm_mem_walk_seq → uvm_mem_single_walk_seq | 워킹 1/0 패턴을 메모리에 써서 읽기-일치 확인 | NO_MEM_WALK_TEST |
| 메모리 액세스 | uvm_mem_access_seq | 메모리 주소별 버스↔백도어 교차 확인 | 백도어 필요NO_MEM_ACCESS_TEST |
| 공유 매핑 검증 | uvm_reg_shared_access_sequvm_mem_shared_access_seq | 동일 레지스터/메모리가 여러 맵에 매핑 되었을 때 값 동기성 체크 | NO_SHARED_ACCESS_TEST |
| 통합 실행 | uvm_reg_mem_built_in_seq | 위 Block-level 시퀀스들을 한 번에 실행 (Attribute로 선택/제외) | 각 시퀀스와 동일 |
| HDL 경로 검증 | uvm_reg_mem_hdl_paths_seq | 지정된 HDL-path 가 실제 시뮬레이션 경로로 유효한지 검사 | HDL path가 없으면 자동 제외 |
Attribute 적용 규칙
블록·레지스터·메모리에 NO_REG_TESTS (또는 각 시퀀스 별 NO_…_TEST) 를 정의하면 해당 객체에 시퀀스가 적용되지 않습니다.
3 | 실행 방법 예시
class reg_test extends uvm_test;
my_env env; // 레지스터 모델 포함 환경
uvm_reg_block rm; // 루트 레지스터 모델 핸들
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
rm = env.regmodel;
endfunction
virtual task run_phase(uvm_phase phase);
// ① 하드웨어 리셋 테스트
uvm_reg_hw_reset_seq rst =
uvm_reg_hw_reset_seq::type_id::create("rst");
rst.model = rm;
rst.start(null); // virtual sequence 로 실행
// ② 비트-바시 + 접근 테스트를 묶은 상위 시퀀스
uvm_reg_mem_built_in_seq all =
uvm_reg_mem_built_in_seq::type_id::create("all");
all.model = rm;
// 특정 서브시퀀스만 실행하도록 설정도 가능
// all.bit_bash_seq_disable(); // 비트-바시 끄기 예시
all.start(null);
endtask
endclass
- model 필드는 루트 블록 핸들을 넣어야 하며, 시퀀서 인자를 주지 않으면 가상 시퀀스 형태로 동작해 자동으로 올바른 버스 시퀀서를 사용합니다.
- 백도어가 필요한 시퀀스를 실행하기 전에 set_hdl_path_root() 나 사용자-정의 back-door 를 설정해 두세요.
4 | 시퀀스 결합 & 커스터마이징 팁
- 가상 시퀀스를 하나 작성해 여러 predefined 시퀀스를 순차·병렬(fork)로 실행하면 전체 레지스터 테스트 플로를 한 시퀀스로 관리할 수 있습니다.
- 시퀀스 클래스는 모두 팩토리 생성이므로, 필요에 따라 서브클래스를 만들어
- 특정 필드 값 범위를 줄이거나,
- 에러 허용 폭(예: ECC 비트 무시)을 재정의할 수 있습니다.
- 장시간 걸리는 메모리 워크 시퀀스는, 큰 메모리를 slice 로 나눠 부분-실행하도록 오버라이드하면 시뮬레이션 시간을 단축할 수 있습니다.
요약
- UVM 레지스터 라이브러리는 HW Reset / Bit-Bash / Access / Shared / Memory Walk 등 핵심 검증 시퀀스를 기본 제공.
- Attribute 로 적용 대상을 세밀하게 제어하고, 필요에 따라 백도어를 구현·지정해야 합니다.
- 상위 가상 시퀀스로 이들 테스트를 조합하면 초기 Bring-up 부터 풀 커버리지 체크까지 손쉽게 자동화할 수 있습니다.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 5. Register Layer Class 사용하기' 카테고리의 다른 글
| [UVM] 5.10 필드 값 랜덤화(Randomization) 사용법 (1) | 2025.05.21 |
|---|---|
| [UVM] 5.9.3 버스 모니터와 레지스터-모델을 연결해 미러를 ‘실시간’ 업데이트 하기 (0) | 2025.05.20 |
| [UVM] 5.9.2.3 레이어드 레지스터-시퀀서 방식 (0) | 2025.05.20 |
| [UVM] 5.9.2.2 가상 시퀀스로 레지스터 시퀀스 실행하기 (0) | 2025.05.19 |
| [UVM] 5.9.2.1 버스 시퀀서에서 레지스터 시퀀스를 직접 실행하기 (0) | 2025.05.19 |