数据高速缓存通路
1 数据高速缓存概述
数据高速缓存(DCache)的数据通路示意图如下:
DCache 是基于 BRAM 访存的两级流水线设计,第一级流水线计算出地址,并直接用地址访问 BRAM,第二级流水线则是对 BRAM 的读写结果进行处理。DCache 主要组成部分如下(其中加粗的部分是和本次实验相关的元件):
- Request Buffer:请求缓冲寄存器,相当于流水线中的 EX-LS 段间寄存器,用来缓存流水线的访存请求。
- Return Buffer:返回数据缓冲寄存器,用于拼接从主存逐个返回的数据。
- Data Memory:数据存储器,用来存储每一个 Cache 行的数据。
- Tag Memory:标签存储器,用来存储每一个 Cache 行的地址标签。
- Valid Memory:有效位存储器,用来存储每一个 Cache 行的有效位。
- Hit Logic:组合电路,用来判断当前访存是否命中。
- Write Data Control:组合电路,用来对流水线发来的写数据进行移位对齐。
- Read Data Control:组合电路,用来对存储器读出或从 Return Buffer 中读出的数据进行移位对齐,并送出给流水线。
- LRU Replace:用来记录 Cache 行的最近最少使用信息,用于 LRU 替换算法。
- Dirty Table:脏位表,用来记录 Cache 行的脏位信息,用于写回数据。
- Write Back Buffer:写回缓冲寄存器,用来缓存需要写回主存的数据。每次写回的数据将是它的
[31:0]
位。 - Miss Address Buffer:写回地址缓冲寄存器,用来缓存需要写回主存的地址。
- Addr Count:用来处理
fence
和fence.i
指令,本次实验暂不涉及。 - Memory Settings:用来配置向主存访问的参数,包括读写个数、长度、地址和写掩码等。
- Main FSM:主状态机,主要用于控制读缺失处理和调控写状态机。
- Write FSM:写状态机,用于控制写缺失处理时的写回行为。
2 基本配置与工作原理
DCache 的基本配置如下:
配置项 | 配置值 | 是否可使用参数配置 |
---|---|---|
Index 位宽 | 4(16 行) | 是 |
Offset 位宽 | 4(单行 16 字节) | 是 |
Tag 位宽 | 24 | 是 |
路数 | 2 | 否 |
DCache 分为两个流水级进行访存:
- 第一级流水级:计算出访存地址,并直接用地址访问使用 BRAM 实现的 Tag Memory, Valid Memory 和 Data Memory。
- 第二级流水级:访存各项信息写入了 Request Buffer,同时获得了本次访存的命中信息:
- 如果命中,则直接将数据从对应的 Cache 行中读出,经过 Read Data Control 后送出给流水线;或者将数据写入对应的 Cache 行。
- 如果不命中,则将本次访存的地址写入 Miss Address Buffer,将需要写回的数据写入 Write Back Buffer,并对存储器发起读请求。同时,写回状态机会被激活,它会判断是否需要写回,如果确实需要写回,则将数据逐个写回主存。
直接把 ALU 的结果送到 BRAM 中?
请阅读我们提供的 BRAM 代码,思考这样是否真的会显著影响时序。
3 主状态机逻辑解析
在这一节中,我们会对 DCache 的主状态机控制逻辑进行详细的解析。需要注意:
- 这里的控制逻辑都是不含非可缓存访问时的控制逻辑;
- 这里的控制逻辑忽略
fence
和fence.i
访问的逻辑。
3.1 状态含义
主状态机由 4 个状态组成,分别是:
- IDLE:空闲或访存命中状态;
- MISS:访存缺失并等待请求数据全部读回的状态;
- REFILL:访存数据全部读回并正在写入 Cache 行的状态;
- WAIT_WRITE:访存数据全部读回并已经写入 Cache 行,正在等待数据写回主存的状态。
3.2 状态转移
主状态机的状态转移图如下:
- 在 IDLE 状态下,如果当前没有访存请求或者有访存请求且命中,则保持 IDLE 状态,否则进入 MISS 状态;
- 在 MISS 状态下,如果当前访存请求的数据全部返回,则进入 REFILL 状态,否则保持 MISS 状态;
- 在 REFILL 状态下,由于写入 Cache 行只需要一个周期,因此下个周期会直接进入 WAIT_WRITE 状态;
- 在 WAIT_WRITE 状态下,如果当前访存写回主存的数据全部写入完毕(由写回状态机通过
wrt_finish
信号标识),则进入 IDLE 状态,否则保持 WAIT_WRITE 状态。
3.3 状态机输出信号
主状态机的输出信号如下:(其中加深的信号和本次实验相关)
信号名 | 信号含义 |
---|---|
req_buf_we |
Request Buffer 写使能 |
wbuf_we |
Write Back Buffer 写使能 |
mbuf_we |
Miss Address Buffer 写使能 |
d_rvalid |
向主存发送的读请求信号 |
wfsm_en |
写状态机激活使能 |
wfsm_reset |
写状态机复位信号 |
mem_we |
主存的字节写使能信号 |
tagv_we |
Tag 表和 Valid 表写使能信号 |
data_from_mem |
选择读数据来源(存储器或 Return Buffer) |
wdata_from_pipe |
选择写入 Cache 的数据来源(流水线或 Return Buffer) |
lru_hit_update |
访存命中时 LRU 替换算法更新使能 |
lru_refill_update |
REFILL 状态下 LRU 替换算法更新使能 |
dirty_refill |
REFILL 状态下脏位表更新使能 |
dirty_we |
写命中时脏位表更新使能 |
dcache_miss |
访存缺失信号 |
4 写回状态机的逻辑解析
4.1 状态含义
写回状态机由 3 个状态组成,分别是:
- INIT:空闲状态,表示当前没有写回请求;
- WRITE:写回状态,表示当前正在写回数据;
- FINISH:写回完成状态,表示当前写回请求已经完成。
4.2 状态转移
写回状态机的状态转移图如下:
- 在 INIT 状态下,如果当前写回请求被主状态机激活(收到
wfsm_en
信号)且写回行为脏,则进入 WRITE 状态;若写回行不为脏,则进入 FINISH 状态,否则保持 INIT 状态; - 在 WRITE 状态下,如果当前写回请求的数据全部写回(收到
d_bvalid
信号),则进入 FINISH 状态,否则保持 WRITE 状态; - 在 FINISH 状态下,如果当前主状态机已经收到写回完成信号(收到
wfsm_reset
信号),则进入 INIT 状态,否则保持 FINISH 状态。
4.3 状态机输出信号
写回状态机的输出信号如下:
信号名 | 信号含义 |
---|---|
wrt_finish |
写回完成信号 |
write_counter_reset |
写回数据计数器复位 |
write_counter_en |
写回数据计数器递增使能 |
d_wvalid |
向主存发送的写请求信号 |
d_wlast |
向主存发送的写请求最后一个信号 |
d_bready |
向主存发送的写回确认请求信号 |