카테고리 없음

Cache 메모리 설계

-운- 2025. 2. 23. 21:08
    • Block size = 4B
    • Memory size = 256B (64Blocks)
    • Cache size = 16B(4sets)
    • Write-back policy
    • req & ack handshaking
    • One req at a time

 

Verilog 코드

 

1. CPU - Cache 인터페이스

  • i_cpu_req: CPU 요청 신호
  • i_cpu_write: CPU 쓰기 요청 신호
  • o_cpu_ack: CPU 요청에 대한 Cache 응답
  • i_cpu_addr: 6-bit CPU 주소
  • i_cpu_wdata: 32-bit CPU 쓰기 데이터
  • o_cpu_rdata: 32-bit CPU 읽기 데이터

2. Cache - Memory 인터페이스

  • o_mem_req: Memory 요청 신호
  • o_mem_write: Memory 쓰기 요청 신호
  • i_mem_ack: Memory 응답 신호
  • o_mem_addr: 6-bit Memory 주소
  • o_mem_wdata: 32-bit Memory 쓰기 데이터
  • i_mem_rdata: 32-bit Memory 읽기 데이터

Cache Control Logic

1. Cache Read/Write Enable 신호

  • cpu_en: CPU 요청이 활성화되었는지 확인 (i_cpu_req & o_cpu_ack)
  • cpu_we: CPU가 데이터를 쓰는 경우 (i_cpu_req & o_cpu_ack & i_cpu_write)
  • cpu_re: CPU가 데이터를 읽는 경우 (i_cpu_req & o_cpu_ack & ~i_cpu_write)
  • mem_en: Memory 액세스가 이루어지는지 확인 (o_mem_req & i_mem_ack)
  • mem_we: Memory 쓰기 동작 여부 (o_mem_req & i_mem_ack & o_mem_write)
  • mem_re: Memory 읽기 동작 여부 (o_mem_req & i_mem_ack & ~o_mem_write)

2. Cache Hit & Miss 판별

  • hit: Valid한 Cache Line이 있고, Tag가 일치하는 경우
  • empty: Valid하지 않은 Cache Line에 접근하는 경우
  • diff: Valid하지만 Tag가 일치하지 않는 경우 (Eviction 필요)
  • miss: empty 또는 diff가 발생한 경우

Memory Access Control

  • mem_no: Cache Hit이거나 Write-Back이 필요 없는 Write Operation → Memory 접근 불필요
  • mem_wb: Cache Miss이며 Write-Back이 필요한 경우 → Eviction 발생
  • mem_rd: Cache Miss이며 Read Operation → Memory에서 새로운 데이터 로드

Tag & Data Storage

  • valid_mem: Valid Bit 저장
  • wb_mem: Write-Back이 필요한 Cache Line 여부 저장
  • tag_mem: Tag 정보 저장
  • data_mem: Cache Data 저장

Testbench code

 

  • Clock(clk, 10ns 주기)과 Reset(rstn)을 생성해 동기식 동작을 제어하도록 설계했다.
  • 초기 20ns 동안 Reset을 비활성화(rstn=0) 후 30ns에 활성화(rstn=1)로 설정해 Cache와 Memory 초기화를 보장하도록 설계했으며, CPU와 Memory 간 다양한 시나리오를 시뮬레이션하기 위해 10개의 명령(cmd)을 순차적으로 수행하도록 설계했다.
  • CPU Part는 Write(ex) 주소 0x04에 0x400 Write)와 Read(ex) 주소 0x06에서 Read)를 통해 Cache Hit, Miss, Write-Back 동작을 테스트하도록 설계했으며, cpu_req, cpu_write, cpu_addr, cpu_wdata 신호를 cache 모듈로 전달하고 cpu_ack, cpu_rdata로 응답을 수신하도록 설계했다.
  • Cache DUT는 Memory Request(mem_req, mem_write, mem_addr, mem_wdata)를 생성해 64개 엔트리(각 32비트) Memory(mem)와 통신하도록 설계했으며, Memory는 Clock 기반으로 읽기(mem_re)와 쓰기(mem_we)를 처리하고 mem_ack로 응답을 제어하도록 설계했다.
  • 시뮬레이션은 1000ns 후 $finish로 종료되도록 설계하였다