지노랩 /JinoLab

[UVM] 5.5.4 메모리 타입(Memory Type) ― uvm_mem 확장으로 RAM·FIFO 등을 모델링하기 본문

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

[UVM] 5.5.4 메모리 타입(Memory Type) ― uvm_mem 확장으로 RAM·FIFO 등을 모델링하기

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

 

1 | 메모리 타입이란?

  • uvm_mem 파생 클래스 한 개가 “같은 폭·깊이·어드레스 규칙”을 공유하는 메모리를 대표.
  • 예) 256×32 B 버퍼 ⇢ BUF256x32_MEM 타입 하나.
  • 블록이나 레지스터 파일의 build() 안에서 여러 인스턴스를 생성해 주소만 달리 배치.
class BUF256x32_MEM extends uvm_mem;
  `uvm_object_utils(BUF256x32_MEM)
endclass

2 | 생성자(new) 패턴

function new(string name="BUF256x32_MEM");
  // super.new(이름, 깊이, 비트폭, access, has_coverage)
  super.new(name,
            256,          // depth
            32,           // n_bits
            "RW",         // access
            build_coverage(UVM_NO_COVERAGE)); // 필요 시 바꿈
endfunction

인자 의미

depth 주소 수 (word 단위)
n_bits word 당 비트폭
access "RO", "RW" 등
has_coverage build_coverage(ID) 호출 결과

3 | 커버리지 모델(옵션)

3-1 생성 시 등록

super.new(name, 256, 32,
          "RW",
          build_coverage(UVM_CVR_ADDR_MAP)); // 주소 커버리지 사용

3-2 covergroup 정의 및 샘플링

covergroup cg_addr;
  coverpoint m_offset {
    option.auto_bin_max = 16;   // 자동 bin
  }
endgroup

function new(string name="BUF256x32_MEM");
  super.new(name, 256, 32, "RW",
            build_coverage(UVM_CVR_ADDR_MAP));
  if (has_coverage(UVM_CVR_ADDR_MAP))
    cg_addr = new();
endfunction

virtual function void sample(uvm_reg_addr_t offset,
                             bit            is_read,
                             uvm_reg_map    map);
  if (get_coverage(UVM_CVR_ADDR_MAP)) begin
    m_offset = offset;
    cg_addr.sample();
  end
endfunction
  • sample() 은 uvm_mem::sample() 후크에서 호출됨 — 시퀀스나 어댑터가 uvm_mem::sample(offset,is_read,map) 을 직접 호출해도 됨.
  • 커버리지가 OFF이면 bin·샘플 모두 건너뜀 → 대규모 SoC에서 성능 절약.

4 | 블록/파일 build()에서 인스턴스화

class codec_blk extends uvm_reg_block;
  rand BUF256x32_MEM  BFR;

  virtual function void build();
    default_map = create_map("sfr", 'h0, 4, UVM_LITTLE_ENDIAN);

    BFR = BUF256x32_MEM::type_id::create("BFR");
    BFR.configure(this);              // parent 블록 연결
    default_map.add_mem(BFR, 'h100, "RW", 0);
  endfunction
endclass

5 | 실무 Best Practice

시나리오 권장 설정

IP 단위 RAM 검증 UVM_CVR_ADDR_MAP 커버리지 ON, auto_bin_max 조정
SoC 레벨에서 성능 우선 UVM_NO_COVERAGE 로 생성·샘플 OFF
백도어 경로 지정 BFR.add_hdl_path("rtl_i.buf_mem");
대용량 DRAM 모델 깊이 값만 크게 주고 peek/poke 로 필요 주소만 접근(스파스)


 

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