跳转至

数据高速缓存通路

1 数据高速缓存概述

数据高速缓存(DCache)的数据通路示意图如下:

image-20230830130316752

DCache 是基于 BRAM 访存的两级流水线设计,第一级流水线计算出地址,并直接用地址访问 BRAM,第二级流水线则是对 BRAM 的读写结果进行处理。DCache 主要组成部分如下(其中加粗的部分是和本次实验相关的元件):

  1. Request Buffer:请求缓冲寄存器,相当于流水线中的 EX-LS 段间寄存器,用来缓存流水线的访存请求。
  2. Return Buffer:返回数据缓冲寄存器,用于拼接从主存逐个返回的数据。
  3. Data Memory:数据存储器,用来存储每一个 Cache 行的数据。
  4. Tag Memory:标签存储器,用来存储每一个 Cache 行的地址标签。
  5. Valid Memory:有效位存储器,用来存储每一个 Cache 行的有效位。
  6. Hit Logic:组合电路,用来判断当前访存是否命中。
  7. Write Data Control:组合电路,用来对流水线发来的写数据进行移位对齐。
  8. Read Data Control:组合电路,用来对存储器读出或从 Return Buffer 中读出的数据进行移位对齐,并送出给流水线。
  9. LRU Replace:用来记录 Cache 行的最近最少使用信息,用于 LRU 替换算法。
  10. Dirty Table:脏位表,用来记录 Cache 行的脏位信息,用于写回数据。
  11. Write Back Buffer:写回缓冲寄存器,用来缓存需要写回主存的数据。每次写回的数据将是它的 [31:0] 位。
  12. Miss Address Buffer:写回地址缓冲寄存器,用来缓存需要写回主存的地址。
  13. Addr Count:用来处理 fencefence.i 指令,本次实验暂不涉及。
  14. Memory Settings:用来配置向主存访问的参数,包括读写个数、长度、地址和写掩码等。
  15. Main FSM:主状态机,主要用于控制读缺失处理和调控写状态机。
  16. 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 的主状态机控制逻辑进行详细的解析。需要注意:

  1. 这里的控制逻辑都是不含非可缓存访问时的控制逻辑;
  2. 这里的控制逻辑忽略 fencefence.i 访问的逻辑。

3.1 状态含义

主状态机由 4 个状态组成,分别是:

  • IDLE:空闲或访存命中状态;
  • MISS:访存缺失并等待请求数据全部读回的状态;
  • REFILL:访存数据全部读回并正在写入 Cache 行的状态;
  • WAIT_WRITE:访存数据全部读回并已经写入 Cache 行,正在等待数据写回主存的状态。

3.2 状态转移

主状态机的状态转移图如下:

image-20230831111610574

  • 在 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 状态转移

写回状态机的状态转移图如下:

image-20230831112715669

  • 在 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 向主存发送的写回确认请求信号