지노랩 /JinoLab
[UVM] 5.10 필드 값 랜덤화(Randomization) 사용법 본문
UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기
[UVM] 5.10 필드 값 랜덤화(Randomization) 사용법
지노랩/JinoLab 2025. 5. 21. 09:18UVM 레지스터 모델은 필드에 기본 제약(constraint) 을 포함할 수 있고, 테스트 단계에서 추가 제약을 더하거나 기존 제약을 해제할 수도 있습니다.
1 | 필드·레지스터·블록의 value 속성
- 각 field 클래스에는 랜덤 대상이 되는 rand bit […] value 멤버가 자동으로 존재합니다.
- 이것은 미러값(mirror) 과는 별개로 “랜덤화할 변수” 역할만 하므로, 직접 get() / set() 으로 읽고 쓰지 않습니다.
2 | 랜덤화 호출 패턴
// 레지스터 r1 의 필드 f1 을 0xF 이하로 제한
bit ok = regmodel.r1.randomize() with { f1.value <= 'hF; };
// 블록 단위 랜덤화 + 추가 제약
regmodel.randomize() with {
r1.f1.value inside {4'h0, 4'hF};
r2.f2.value dist {6'h00 := 80, 6'h3F := 20};
};
- randomize() 는 false 반환 시 제약 충돌 → 동일 with 블록으로 재시도 가능.
3 | DUT 에 값 반영하기 – update()
랜덤화가 끝나면 미러에는 새로운 값이 들어가 있지만 RTL DUT에는 아직 쓰이지 않았습니다.
// 레지스터 단위 업로드
regmodel.r1.update(.status(st)); // 변경된 필드만 버스 write
// 블록 전체 업로드
regmodel.update(.status(st));
update() 는 미러와 DUT 값이 다를 때만 버스 트랜잭션을 생성하므로, 시뮬레이션 시간을 절약할 수 있습니다.
4 | 제약 완화(OFF)·강화(ON)
모델 생성 시 정의돼 있는 constraint 블록을 선택적으로 끌 수 있습니다.
// consistency 라는 블록 비활성화
regmodel.r1.consistency.constraint_mode(0);
// 테스트 후 다시 활성
regmodel.r1.consistency.constraint_mode(1);
5 | 사용자 확장 제약
- 필드·레지스터·블록 클래스를 상속하여 새로운 constraint 블록을 추가하고,
- 팩토리(set_type_override_by_type) 로 기존 타입을 대체하면 모델 전체에 새로운 제약을 적용할 수 있습니다.
class my_fld_ext extends orig_fld_type;
constraint small_range { value inside {[8'h10:8'h1F]}; }
`uvm_object_utils(my_fld_ext)
endclass
factory.set_type_override_by_type(orig_fld_type::get_type(),
my_fld_ext::get_type());
6 | post_randomize() 오버라이드 시 주의
필드 클래스에서 post_randomize() 를 재정의할 때 반드시 super.post_randomize() 를 호출해야 미러 값이 올바르게 설정됩니다.
function void post_randomize();
super.post_randomize();
// 추가 후처리 …
endfunction
요약
- value 멤버에 제약을 걸어 랜덤화 → update() 로 DUT에 쓰기
- constraint 블록은 constraint_mode() 로 ON/OFF 가능
- 필요한 경우 클래스 상속 + 팩토리 오버라이드 로 제약·필드 구조를 확장
이를 통해 커버리지 지향 랜덤 패턴부터 코너 케이스 강제까지 유연하게 생성할 수 있습니다.
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 5. Register Layer Class 사용하기' 카테고리의 다른 글
| [UVM] 5.11 레지스터-라이브러리에서 제공하는 사전 정의(Pre-defined) 시퀀스 활용 가이드 (0) | 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 |