지노랩 /JinoLab

[UVM] 5.7.1 미리 정의-돼 있는 “특수 레지스터” 두 가지 본문

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

[UVM] 5.7.1 미리 정의-돼 있는 “특수 레지스터” 두 가지

지노랩/JinoLab 2025. 5. 14. 11:44

 

1. 간접 인덱스(Indirect-Indexed) 레지스터

구성 역할 UVM 클래스

INDEX 레지스터 배열 오프셋 지정 사용자가 설계한 보통 uvm_reg
DATA 레지스터 INDEX가 가리키는 요소를 R/W uvm_reg_indirect_data (UVM 제공)
INDIRECT_REG[n] 실제 데이터가 저장된 레지스터 배열 일반 uvm_reg 인스턴스 n개

생성 흐름

// ① 데이터 배열 먼저 생성
foreach (INDIRECT_REG[i]) begin
  INDIRECT_REG[i] = ind_reg::type_id::create($sformatf("INDIRECT[%0d]",i));
  INDIRECT_REG[i].configure(this, null); INDIRECT_REG[i].build();
end

// ② INDEX 레지스터
IND_IDX = ind_idx_reg::type_id::create("IND_IDX");
IND_IDX.configure(this, null); IND_IDX.build();

// ③ DATA 레지스터 – 간접 규칙 연결
IND_DATA = ind_data_reg::type_id::create("IND_DATA");
IND_DATA.configure(IND_IDX, INDIRECT_REG, this, null);
IND_DATA.build();

// ④ 주소 맵에는 INDEX·DATA만 등록
default_map = create_map("", 0, 4, UVM_BIG_ENDIAN);
default_map.add_reg(IND_IDX,  0);
default_map.add_reg(IND_DATA, 4);
  • DATA 레지스터에는 필드가 없어야 한다.
  • INDIRECT_REG[]맵 미등록 → 고유 주소가 없으므로 back-door 로만 접근 가능.
  • back-door read/write 를 DATA에 시도하면 에러; INDIRECT 레지스터를 직접 peek/poke 해야 한다.

다른 방식의 간접 액세스?

INDEX·DATA 패턴이 다르면 사용자-정의 레지스터 클래스를 만들어 uvm_reg_frontdoor 혹은 uvm_reg_backdoor 로 동작을 재현한다.


2. FIFO 레지스터

특성 UVM 지원 클래스

주소 1개에 WRITE → FIFO pushREAD → FIFO pop uvm_reg_fifo

선언 예

class FIFO_REG extends uvm_reg_fifo;
  function new(string name="FIFO_REG");
    // (이름, 깊이, 비트폭, 커버리지)
    super.new(name, 8, 32, UVM_NO_COVERAGE);
  endfunction
  `uvm_object_utils(FIFO_REG)
endclass
  • back-door 접근 금지: FIFO 커서를 무시하기 때문.
  • FIFO full/empty 상태는 보통 별도 STATUS 레지스터 비트로 노출한다.


 

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