跳到主要内容

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 原因。