Search

Lab6

cache-lab.pdf
342.0KB
Lab6.zip
7.2KB
Lab6_오지환_20190395_장준하_20190562.zip
1744.3KB
github
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

Cache Lab

Cache Structure

두 개의 bank가 있다. tag bank와 data bank
goal : design a simple “direct-mapped” cache
direct-mapped cache를 할꺼기 때문에 particular cache replacement policy가 필요가 없다.
cache write-hit 와 write-miss에 대해서는 즉시 쓰기 방식과 write-allocate 방식을 해라

Files

pipelined CPU implementation에서 시작해라.
lab4에서 해도 되긴한다.

Cache Labe

1.
Instruction cache → 필요 없다. 1 사이클 이내로 페치 될 거임

Data cache

single level directed-mapped cache를 구현하자.
Capacity
tag bank를 제외하고
128Byte 캐시 캐퍼시티다
한 라인당 4개의 워드(1워드다 4bytes), 결국 8라인이구나
Write-through
Write-allocate
Blocking cache
Latency: cache hit가지 1 사이클 걸린
Memory access granularity: 4 워드

Memory Model

instruction memory는 한 사이클 만에 접근가능하다.
data memory는 6cycle 안에 access해야한다.
A. JAL B. JALR C. BEQ, BNE, BLT, BGE, BLTU, BGEU D. LW E. SW F. ADDI, SLTI, SLTIU, XORI, ORI, ANDI, SLLI, SRLI, SRAI G. ADD, SUB, SLL, SLT, SLTU, XOR, SRL, SRA, OR, A

디자인

Cache

input : INST_EX_MEM, ALU_OUT
ALU_OUT을 비트별로 쪼개서 테이블에 접근
접근 한 뒤에 태그를 비교
hit인지 판단
output : hit, DATA
DATA → D_MEM_DI와 연결
주소가 12비트
한 라인당 4개의 워드, 8라인이 필요하다.
8라인을 표현하려면 idx는 3비트
g는 2비트
bo는 2비트
tag는 5비트
tag, idx, bo, g순서

Riscv_top

Hit인지 Miss인지 & INST_EX_MEM 가지고 판단해서, IsNop과 Stall 처리하기

Load

만약 INST_EX_MEM이 Load라면
1.
Hit인지 Miss인지 판단
Hit 라면?
DATA에다가 block offset파악해서 data 담기
→ 1사이클만에 DATA 뽑기 가능
→ 추가적인 Stall, Nop 필요 없음
Miss라면?
D_MEM_ADDR에다가 주소값을 생성해서 넣음
이 때, bo값을 00, 01, 10, 11로 조절해서 주소값을 생성해서 집어넣는다.
한 사이클마다 하나씩 만들어서 집어넣어야함.
그렇게 오는 DOUT값을 쓰고(2,3,4,5 사이클 동안) 6번째 사이클에, 들어오는 주소를 받아서 Hit시킨다음에 DATA를 채움.
2,3,4,5 사이클 동안은 Miss를 유지해야한다.

Write

만약 INST_EX_MEM이 STORE라면
1.
Hit인지 Miss인지 판단
Hit라면?
Cache에 해당하는 블록에 워드 값을 갱신함과 동시에 MEM에 접근해서 값 바로 갱신하기
Miss라면?
D_MEM에 그 주소값을 보내서 갱신한 다음(1사이클)
블록에 해당하는 크기를 1사이클 씩 들고와서 Cache에다가 옮겨 담는다.(2,3,4,5)
그동안은 Miss로 인한 버블을 계속 발생

해야할거

pc_ID_EX_WE, pc_EX_MEM_WE

기존 pcWrite → pc_WE로 변경
pc_WE → pc값 업데이트
pc_IF_ID_WE → pc_IF_ID 값 업데이트
pc_WE = pcWrite | pc_ID_EX_WE | pc_EX_MEM_WE
pc_IF_ID_WE = pcWrite | pc_ID_EX_WE | pc_EX_MEM_WE
pc_ID_EX_WE = pc_ID_EX_WE
pc_EX_MEM_WE = pc_EX_MEM_WE

IF_ID_WE, ID_EX_WE, EX_MEM_WE

추가하고 instruction 넘길 때 사용

is_Nop_MEM_WB

이거이면 Nop 넣기 & regWrite 0으로 넣기

Cache 제대로 연결하기

기존에 D_MEM로 연결되어있는 부분을
Cache로 치환하기
alu_out → Cache로의 input ADDR
RDATA → Cache에서의 output
WDATA → Cache로의 input
1.
D_MEM_ADDR
2.
D_MEM_DI
3.
D_MEM_DOUT