一级数据缓存
DCache 在南湖架构中与访存流水线紧耦合, 对外通过 TileLink 总线协议和 L2 Cache 直接交互. 南湖架构中 DCache 默认为 128KB 总容量, 8 路组相联结构, 采用伪 LRU 替换和 SECDED 校验. dcache 与 l2 cache 配合来处理 128 KB 容量带来的缓存别名问题. 南湖架构的 dcache 支持自定义的 cache 操作.
DCache 内部模块包括:
模块名称 | 说明 |
---|---|
Load PipeLine (Load 流水线) | 与 Load 访存流水线紧耦合, 3 拍读出数据 |
Main Pipeline (主流水线) | 负责 store, probe, replace, 原子操作的执行 |
Refill Pipeline (Refill 流水线) | 负责将 L2 重填的数据写回 dcache |
Atomics Unit (AtomicsReplayEntry) | 调度原子请求 |
Miss Queue (MSHRs, 16 项) | 向 L2 请求缺失的块, 每一项通过一个状态机控制该 miss 请求在 DCache 中的流动 |
Probe Queue (8 项) | 接收 L2 Cache 的一致性请求 |
Writeback Queue (18 项) | 负责将替换块写回 L2 Cache, 或应答 Probe 请求 |
Committed Store Buffer 在向 DCache 发送写请求的同时也会作为写请求的重发缓冲区. DCache 以及 Committed Store Buffer 的整体结构示意图如下:
接口
雁栖湖架构中的 DCache 对 L2 Cache 采用 TileLink 总线协议, TileLink 涉及到的一致性请求主要分为三类:
- Acquire 获取权限
- Probe 被动释放权限
- Release 主动释放权限
请求处理流程
Load 请求处理流程
- 经过三级流水, 命中则直接返回, 失效则进入 Miss Queue
- Miss Queue 取回回填数据并转发给 Load Queue
- 在主流水线中将回填数据写入 DCache
- 如果需要替换块, 在 Writeback Queue 中将替换块写回
Store 请求处理流程
Store Replay Unit 接收来自 Store Buffer 的请求, 在主流水线中访问 DCache:
- 如果 DCache 命中
- 在 Main Pipeline 中完成对 DCache 的写入
- 如果 DCache 未命中且 Miss Queue 已满(或拒绝接受请求)
- 由 Store Buffer 在一段时间后重发此请求
- 如果 DCache 未命中且 Miss Queue 成功接受请求
- 由 Miss Queue 继续执行后续操作
- 在完成后通知 Store Buffer, 并通过 Refill Pipe 更新 dcache
- 如果有被替换的块, 在 Writeback Queue 中写回
- 特别地, 被替换的块只有在替换它的块到达 DCache 之后才被 Writeback Queue 向下写.
Atomics 请求处理流程
参见原子指令的处理流程.
Probe 请求处理流程
- 接收来自 L2 Cache 的 Probe 请求
- 在主流水线中修改被 Probe 的块的权限
- 返回应答, 同时写回脏数据