访存系统总体结构
访存系统既要追求 Load 低延迟,又必须维护程序规定的内存顺序。它把地址生成、翻译、依赖判断、Cache 访问、重放和提交结合在一起。
源码总入口:mem/MemBlock.scala。子目录 mem/pipeline/、mem/lsqueue/、mem/sbuffer/、cache/dcache/ 分别承载流水、顺序检查、已提交 Store 缓冲和 L1 数据 Cache。
Load 的乐观执行
为了低延迟,Load 会尽早执行,可能越过地址尚未确定的老 Store。硬件随后检查是否读错;如果发现依赖或一致性条件不满足,就 replay 或重定向。
Store 的保守可见性
Store 可提前计算地址和数据,但在提交前不能不可逆地修改 Cache。Store Queue 保存推测 Store;提交后再进入 SBuffer/Cache 路径。
四类失败不要混在一起
- TLB miss:地址翻译尚未完成;
- DCache miss:数据不在 L1;
- bank conflict/端口冲突:资源暂不可用;
- memory-order violation:先前乐观调度被证明错误。