Load/Store Queue 与重放
LSQ 是“乱序执行”和“内存顺序正确”之间的协调者。
Store Queue
入口:mem/lsqueue/StoreQueue.scala。它记录尚未完全提交到内存系统的 Store 地址、数据、掩码和年龄,并向年轻 Load 提供 forwarding 或冲突信息。
Load Queue
入口:mem/lsqueue/LoadQueue.scala。辅助模块包括:
LoadQueueRAW.scala:Read-After-Write 依赖相关检查;LoadQueueRAR.scala:Read-After-Read/探测相关顺序;LoadQueueReplay.scala:维护需重放的 Load;LoadQueueUncache.scala:非缓存访问路径。
Store-to-Load Forwarding
当年轻 Load 与老 Store 地址重叠且 Store 数据已知时,可以直接从 Store Queue 转发,而不必等待 Store 写入 Cache。必须正确处理字节掩码、部分重叠和多个 Store 的年龄优先级。
为什么会 replay
- 地址/数据依赖尚未满足;
- Cache bank 或 MSHR 资源冲突;
- TLB miss 或异常检查未完成;
- 发现更老 Store 与已执行 Load 冲突;
- 一致性 probe 或其他顺序事件要求重做。
实验
构造同地址 Store 后跟 Load,再构造 Store 地址很晚才算出的版本。比较正常 forwarding 与顺序违规恢复时的波形,尤其关注 Load Queue 项、replay request 和 redirect 原因。