지노랩 /JinoLab
[UVM] 5.9.2.1 버스 시퀀서에서 레지스터 시퀀스를 직접 실행하기 본문
UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기
[UVM] 5.9.2.1 버스 시퀀서에서 레지스터 시퀀스를 직접 실행하기
지노랩/JinoLab 2025. 5. 19. 09:06
1 | 개념
- 레지스터 시퀀스가 버스 시퀀서(APB, AHB, AXI 등) 위에서 바로 동작한다.
- RAL(Register Abstraction Layer)이 생성한 uvm_reg_item → 어댑터가 버스 전용 item으로 변환 → 버스 시퀀서가 실행.
- 따라서 다른 버스 시퀀스들과 같은 레벨에서 경쟁(arbiter)하며, grab/lock 도 그대로 사용할 수 있다.

2 | 환경 (connect_phase) 설정
class block_env extends uvm_env;
block_reg_model regmodel; // 루트 RAL
apb_agent apb; // 버스 UVC
virtual function void connect_phase(uvm_phase phase);
// 루트 모델인지 확인
if (regmodel.get_parent() == null) begin
// ① APB용 트랜잭션 어댑터 생성
reg2apb_adapter adp = reg2apb_adapter::type_id::create(
"reg2apb", this);
// ② RAL의 APB 주소 맵에 시퀀서·어댑터 등록
regmodel.APB.set_sequencer(apb.sequencer, adp);
// ③ 묵시적(prediction) 모드 ON → RAL이 자동으로 미러 업데이트
regmodel.set_auto_predict(1);
end
endfunction
endclass
맵이 하나뿐이면 regmodel.default_map.set_sequencer(...) 로 써도 된다.
3 | 레지스터 시퀀스 작성
class my_reg_sequence extends uvm_reg_sequence;
`uvm_object_utils(my_reg_sequence)
block_reg_model model; // 반드시 외부에서 주입
virtual task body();
uvm_status_e st;
uvm_reg_data_t data;
// WRITE 예
model.A.write(st, 'h33, .parent(this));
if (st == UVM_NOT_OK)
`uvm_error("SEQ", "write 실패")
// READ 예
model.A.read(st, data, .parent(this));
if (data != 'h33)
`uvm_error("SEQ", $sformatf("예상값 불일치: %0h", data))
endtask
endclass
uvm_reg_sequence 는 기본적으로 uvm_reg_item 을 생성해 버스 시퀀서로 내보낸다.
필요하면 파라미터를 바꿔 다른 베이스 시퀀스를 끼워 넣을 수도 있다.
4 | 시퀀스 실행 (test)
class my_test extends uvm_test;
block_env env;
virtual task run_phase(uvm_phase phase);
// 시퀀스 인스턴스
my_reg_sequence seq = my_reg_sequence::type_id::create("seq", this);
// 루트 RAL을 시퀀스에 연결
seq.model = env.regmodel;
// ① APB 시퀀서(master)에서 실행
seq.start(env.apb.sequencer);
// grab/lock 사용 예 (버스 독점)
// seq.grab(env.apb.sequencer);
// ... 레지스터 접근 ...
// seq.ungrab(env.apb.sequencer);
endtask
endclass
5 | 특징·장단점
항목 설명
| 장점 | 구현이 가장 단순, 예측 자동, grab/lock·콜백(pre_do 등) 그대로 사용 가능 |
| 제약 | DUT 레지스터가 하나의 버스로만 접근될 때 적합. 복수 버스(AXI + APB 등) 환경에선 가상 시퀀스 방식이 필요 |
| 동시성 | 레지스터 시퀀스와 다른 “네이티브” 버스 시퀀스가 같은 시퀀서에서 경쟁하므로, 우선순위·재진입(lock) 로직 고려 필요 |
본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.
'UVM(Universal Verification Methodology) > 5. Register Layer Class 사용하기' 카테고리의 다른 글
| [UVM] 5.9.2.3 레이어드 레지스터-시퀀서 방식 (0) | 2025.05.20 |
|---|---|
| [UVM] 5.9.2.2 가상 시퀀스로 레지스터 시퀀스 실행하기 (0) | 2025.05.19 |
| [UVM] 5.9.2 버스 시퀀서 통합 ― 레지스터 모델이 실제 버스를 구동·관측하도록 연결하는 세 가지 패턴 (0) | 2025.05.18 |
| [UVM] 5.9.1 트랜잭션 어댑터(Transaction Adapter) (0) | 2025.05.18 |
| [UVM] 5.9 레지스터 모델 통합 ― 버스 에이전트와 모델을 연결하는 3가지 방식 (0) | 2025.05.17 |