지노랩 /JinoLab

[UVM] 5.7.2 매핑되지 않은(unmapped) 레지스터·메모리 다루기 본문

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

[UVM] 5.7.2 매핑되지 않은(unmapped) 레지스터·메모리 다루기

지노랩/JinoLab 2025. 5. 15. 09:46

 

1 | “Unmapped”이란?

  • 선형 주소 공간에 자리 X
  • 예) 대용량 테이블을 INDEX + DATA 두 레지스터로만 접근
    → DATA 포트가 가리키는 실레지스터들은 외부 주소가 없다.

2 | 사용자-정의 Front-door 로 액세스 로직 캡슐화

2-1 클래스 작성 (extends uvm_reg_frontdoor)

class indexed_reg_fd extends uvm_reg_frontdoor;
  uvm_reg m_idx, m_data;
  bit [7:0] m_off;
  function new(string name="indexed_fd"); super.new(name); endfunction
  function void configure(uvm_reg idx, uvm_reg data, bit [7:0] off);
    m_idx  = idx; m_data = data; m_off = off;
  endfunction

  virtual task body(uvm_reg_item rw);
    // ① INDEX 레지스터에 오프셋 쓰기
    m_idx.write(rw.status, m_off);
    if (rw.status != UVM_IS_OK) return;

    // ② DATA 레지스터 R/W
    if (rw.kind == UVM_WRITE)
         m_data.write(rw.status, rw.value[0]);
    else m_data.read (rw.status, rw.value[0]);
  endtask
endclass

2-2 연결 (build 단계)

foreach (TABLE[i]) begin
  indexed_reg_fd fd = new($sformatf("fd_%0d",i));
  fd.configure(IDX, DATA, i);
  TABLE[i].set_frontdoor(fd, default_map);   // APB 맵 전용
end
  • map 기준으로 등록 → 다른 인터페이스(예: AXI)에는 기본 매핑 유지 가능.

3 | 미러 (predict) 갱신 문제

버스 모니터는 INDEX/DATA 주소만 관측 → 실제 테이블 엔트리 미러가 안 맞음.
해결: predict() 오버라이드

function bit my_data_reg::predict(uvm_reg_data_t val, ...);
  int idx = IDX.get();
  return TABLE[idx].predict(val, ...);  // 실제 엔트리에게 위임
endfunction

uvm_reg_indirect_data 가 이미 동일 패턴을 구현하므로 참고.


4 | 추가 예: 다양한 사용자-정의 매커니즘

특수 구조 구현 포인트

뱅크 셀렉트 front-door: 선택 레지스터 → 실제 regs 주소 계산
페이지 기반 플래시 front-door: page load/unload 시퀀스 포함
멀티 인터페이스 APB는 front-door, JTAG은 기본 맵 같이 혼용


 

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