지노랩 /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
를 바탕으로 작성된 글입니다.