지노랩 /JinoLab

[UVM] 5.7.4 구현 되지 않은(Unimplemented) 레지스터 다루기 본문

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

[UVM] 5.7.4 구현 되지 않은(Unimplemented) 레지스터 다루기

지노랩/JinoLab 2025. 5. 16. 09:53

 

1 | 기본 아이디어

문제 해결책

RTL 내부에 물리적 레지스터가 없음 → 버스 트랜잭션이 실패 미러(mirror) 자체를 “가상 장치”로 삼아 R/W 수행

즉, 버스로 실제 접근하지 않고 레지스터 추상 클래스(미러 값) 에서 직접 읽고 쓴다.


2 | 사용자-정의 Front-door / Back-door 구현

2-1 Front-door(버스 경로 대체)

class not_impl_fd extends uvm_reg_frontdoor;   // uvm_sequence
  virtual task body();                         // rw_info 이미 세팅됨
    uvm_reg R;  $cast(R, rw_info.element);

    // READ: 미러 get()
    if (rw_info.kind == UVM_READ)
      rw_info.value[0] = R.get();

    // WRITE: rw_info.value[0] 이미 원하는 값 포함

    // 예측(prediction) 수동 반영
    R.predict(rw_info.value[0], -1,
              (rw_info.kind==UVM_READ) ? UVM_PREDICT_READ
                                      : UVM_PREDICT_WRITE,
              rw_info.path, rw_info.map);
  endtask
endclass

2-2 (선택) Back-door

  • 같은 동작을 extends uvm_reg_backdoor 로 복사-붙여도 됨
    → 백도어 패스(UVM_BACKDOOR)로 호출될 때 동일하게 작동

3 | 모델에 연결하는 위치

환경(ENV)에서 후-등록 예

function void connect_phase(uvm_phase phase);
  not_impl_fd fd = new;
  `uvm_warning("NotYetImpl",
    "Register R2 는 RTL에 없으므로 미러 기반 프런트도어로 대체합니다.");
  regmodel.R2.set_frontdoor(fd);            // default_map 모든 인터페이스에 적용
endfunction

블록 build() 안에서(Generator 불가 → 사용 시 환경 쪽 삽입)

if (!rtl_has_R2) begin
  not_impl_fd fd = new;
  R2.set_frontdoor(fd);
end

4 | 사용-시 주의

항목 설명

커버리지 R/W 가 미러에만 적용돼도 read/write 호출이 있으므로 기능-커버리지 정상 수집
시뮬 속도 버스가 아예 발생하지 않아 0-time, 초기화 가속
나중에 RTL 구현 Front-door 등록 코드를 제거(또는 조건부 컴파일) 하면 즉시 실제 버스 경로로 전환 가능
로그 Warning/info 로 “가상 레지스터” 사용 사실을 명확히 남겨 혼동 방지


 

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