지노랩 /JinoLab

[UVM] 5.9.2.2 가상 시퀀스로 레지스터 시퀀스 실행하기 본문

UVM(Universal Verification Methodology)/5. Register Layer Class 사용하기

[UVM] 5.9.2.2 가상 시퀀스로 레지스터 시퀀스 실행하기

지노랩/JinoLab 2025. 5. 19. 11:11

 

1 | 상황

  • DUT 레지스터가 APB·Wishbone 처럼 여러 버스를 통해 접근 가능.
  • 시퀀스 본문에서 어떤 버스인지 언급하지 않고와 같이 호출하고 싶다.
  • model.regA.write(...); // 버스 X model.regB.read (...); // 버스 Y

가상 시퀀스(virtual sequence) 로 실행하면
→ RAL이 맵에 따라 자동으로 올바른 버스 시퀀서를 선택한다.


2 | 환경-측 연결 (connect_phase)

if (regmodel.get_parent() == null) begin
  // (1) 각 주소맵에 버스 시퀀서 + 어댑터 등록
  regmodel.APB.set_sequencer(apb.sequencer,    reg2apb_adapter::type_id::create("adp_apb"));
  regmodel.WSH.set_sequencer(wsh.sequencer,    reg2wsh_adapter::type_id::create("adp_wsh"));

  // (2) 묵시적 예측 켜 둔다
  regmodel.set_auto_predict(1);
end
  • 두 개 이상의 (맵, 시퀀서, 어댑터) 쌍을 RAL에 등록해 두기만 하면 준비 완료!

3 | 레지스터 시퀀스 예시

class dualbus_reg_seq extends uvm_reg_sequence;
  `uvm_object_utils(dualbus_reg_seq)
  block_reg_model model;

  virtual task body();
    uvm_status_e st;
    fork
      model.APB.write(st, 'h33, .parent(this));  // APB 통해 쓰기
      model.WSH.read (st, 'h66, .parent(this));  // Wishbone 통해 읽기
    join
  endtask
endclass
  • map 인자 생략 → RAL이 regA 는 APB 맵, regB 는 Wishbone 맵이라는 사실을 내부 테이블로 판단.

4 | 테스트에서 실행 (가상 시퀀스)

dualbus_reg_seq seq =
    dualbus_reg_seq::type_id::create("seq", this);
seq.model = env.regmodel;

/* 주의: start() 에 **시퀀서를 지정하지 않고** null 전달 */
seq.start(null);
  • null을 주면 UVM은 “가상 시퀀스” 로 인식하고,
    시퀀스 안에서 호출되는 각 write/read 마다 RAL이 알아서 해당 버스 시퀀서를 선택한다.

5 | 특수 상황 – 특정 버스 독점(grab/lock)

테스트 코너-케이스에서 APB 시퀀서를 잠깐 독점하고 싶다면:

seq.grab(regmodel.APB.get_sequencer());
  // … 독점 구간 …
seq.ungrab(regmodel.APB.get_sequencer());
  • 의존성이 생기므로 재-사용성이 낮아질 수 있다는 점을 유의.

6 | 장·단점

항목 설명

장점 • 시퀀스 코드가 버스 비-의존적 → 블록/SoC 어느 수준에서도 재-사용• 서로 다른 버스들에 대한 동시 액세스 가능 (fork)
단점 • grab/lock 사용 시 버스-특정 의존성 삽입 위험• 시퀀스 디버깅 시 실제 어느 버스가 선택됐는지 로그로 확인 필요


 

본 내용은
accellera에서 공개한
Universal Verification Methodology
(UVM) 1.2 User's Guide
를 바탕으로 작성된 글입니다.