
图片来源:https://docs.xiangshan.cc/projects/design/zh-cn/kunminghu-v3/frontend/ICache/Array/
结合香山昆明湖 V3 的真实参数(64B 缓存行、8×8B DataArray、BPU 动态取指块),这张图本质是解释 BPU 如何用"32B 对齐边界"保证 ICache 无访问冲突。
以下是重新梳理的精准解释:
1. 图的抽象含义(非 8B 物理 Bank)
虽然 V3 默认物理 DataArray 是 8 个 8B Bank,但这张图是为了说明"跨 Set 冲突"而画的抽象逻辑模型。
- 图中每行是一个 Set(缓存行,64B),分为 8 个格子(可理解为 8B 粒度的排布,或抽象为 32B 对齐的大块)。
set x和set x+1纵向排列,代表 ICache 的NumInterleaveBanks(交织物理 SRAM)。若一拍同时访问同列(如都访问 bank4),就会引发物理 SRAM 冲突。startVAddr落在set x的bank6,意味着取指从非对齐位置开始,可能跨越到set x+1。
2. 关键地址与对齐边界(图中箭头)
- startVAddr :取指起始地址(图中在
set x的bank6)。 - startVAddr+32 / +64:直观的地址偏移标记。
- (startVAddr+64) aligned to 32 (核心红线):
- 从起始地址加 64B 后,向下对齐到 32B 边界。
- 图中该箭头指向
set x+1的bank3与bank4之间。这定义了取指块的安全右极限。
3. takenCfiPosition 的强制约束
- 定义:BPU 预测的分支跳转指令位置(取指块动态终点)。
- 规则 :BPU 硬件设计强制
takenCfiPosition必须落在上述"32B 对齐边界"之前。 - 图中体现 :红色高亮的
takenCfiPosition在set x+1的bank6(靠近起点),但无论如何向右延伸,至多只能到set x+1的bank3末尾。 - 绝对禁止 :不可能落到
bank4及以后。
4. 为何这样能"保证不冲突"?
- 固定安全窗口 :起点
bank6(set x)+ 边界截断(set x+1 的 bank3 末),实际覆盖了连续的 64B 空间(跨两个 Set,但范围被锁死)。 - 避免同列碰撞 :若允许落到
bank4及以后(如 bank4~bank7),取指范围会过度延伸,导致同一拍内对set x和set x+1的同名物理 Bank 产生双重访问(冲突)。 - ICache 无条件信任 :BPU 把非法的预测值消灭在源头,ICache 只需按
takenCfiPosition激活对应的 8B 物理 Bank(V3 实际动作),无需动态拼接或冲突检查,实现"傻而快"。 - 跨页兜底:实际 V3 中,若此边界跨越 4KB 页,BPU/FTQ 会进一步截断到页尾,保证不跨页。
5. 一句话总结图示
这张图用抽象 Bank 证明:BPU 通过"+64B 对齐到 32B"的硬约束,把动态取指块锁死在 4 个逻辑块(64B)内,确保不越界到 bank4,从而从物理上杜绝了 ICache 的跨 Set 访问冲突。