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