香山分支预测单元时序介绍

三级流水线的时序设计是香山 BPU 的灵魂所在。预测结果重定向信号如何产生,如何根据预测结果生成新的PC,如何处理三个通道的预测结果,都会在本节中进行介绍。

一周期无空泡预测

uFTB 是香山 BPU 中唯一一个可以在一周期便可以产生预测结果的预测器,上图中展示了 uFTB 的预测过程。s0_pc 由 BPU 顶层送入,s1 周期生效时,s1_pc 保存了上一周期 s0_pc 的值,依次类推。也就是说传入的 s0_pc 的值会随流水线向下移动。

在 s1 周期生效时,uFTB 会接收到本周期传来的 s1_fire 信号,并根据 s1_pc 指示的地址,在本周期生成预测结果,在预测结果中可以获取新的 PC 值。

如图所示,BPU 顶层根据 s1 预测结果通道,分析出下一个 PC 值的位置(即图中的 target),并将其送往 npc_Gen (即新PC生成器)中,用于产生下一个周期的 s0_pc。

于是下一周期,uFTB 获取到了新的 PC 值,并开始了新 PC 值预测块的产生。由此可见,仅凭借 s1 周期,便可以以一周期一个预测块的速度来产生预测结果。

预测结果重定向

但除了 uFTB 以外,其他预测器都需要 2-3 个周期才可以产生预测结果,如何利用起他们的预测结果?又如何生成预测结果重定向信号呢?

如图中所示,一个两周期产生预测结果的 Predirector 2 ,可以在 s2 周期,向 s2 预测结果通道内输出它的预测结果。BPU 顶层拿到预测结果后,分析出预测块的跳转目标地址 target 并连向 npc_Gen

此时连向 npc_Gen 的信号中,既有 s2 产生的旧 PC 的预测结果,又有 s1 产生的新 PC 的预测结果,该如何抉择新 PC 用哪一个呢?

通过之前的介绍,我们已经知道,BPU 会将 s2 的预测结果与上周期 s1 的预测结果进行比较,如果预测结果不同,那么说明 s1 预测错了,自然 s1 基于上周期错误预测结果产生的本周期预测结果也是错误的,因此在本周期如果预测结果产生错误,npc_Gen 将使用 s2 所提供的 target 作为新的 s0_pc

这个过程画在流水线结构图中是这样的:

Diff 比较器通过获取 s1 周期的预测结果,与 s1 周期的预测结果进行对比产生 diff 信号,指导 npc_Gen 进行下一条 pc 的生成。与此同时,diff 信号指示了 s1 阶段的预测结果发生错误,可直接用于 BPU 发往 FTQ 的预测结果中 s2 通道的预测结果重定向通道,指导 FTQ 覆盖之前的预测结果。

Diff 信号还会通过 s2_redirect 接口送往每个子预测器,指导子预测器进行状态的更新。

除此之外,当 s2 预测结果重定向发生时,说明 s1 通道预测结果已经发生错误,s2 阶段不能继续进行预测,需及时将子预测器流水线控制信号 s2_fire 置为无效,并等待纠正后的预测结果流入。

s3 预测结果的重定向与此类似,其流水线结构图如下所示。具体的处理过程留给大家来分析。

重定向请求与其他信息生成

只有当三个阶段的预测信息都错误时,才会产生有外部重定向请求发生,此时 npc_Gen 会接收到来自重定向请求中的 pc 地址。由于当重定向请求发生时,我们认为三阶段均预测错误,因此需要将三个阶段的 fire 信号全部置为无效,然后 npc_Gen 采用重定向请求中需要恢复的 PC,重新开始预测。

其他信息,例如全局历史的生成方式与PC的生成方式一致,都是在顶层通过三阶段预测信息来维护,全局历史会根据每一阶段的预测结果来产生新的分支历史。

流水线控制信号

学习了流水线的具体流程,我们应该可以理解子预测器接口中的流水线控制信号了,如下

  • s0_fire, s1_fire, s2_fire, s3_fire 指示每个流水级是否工作
  • s2_redirect, s3_redirect 指示是否有预测结果重定向发生
  • s1_ready, s2_ready, s3_ready 子预测器发给BPU顶层,表示相应流水级是否就绪

总结

至此,你应该懂得了香山分支预测单元的基础设计思想、对外交互逻辑、内部结构、时序等内容,并对 BPU 的工作原理有了大致的理解,香山的 BPU 对你来说已经不再神秘。

接下来你可以阅读重要结构及接口文档,并结合香山 BPU 源代码对 BPU 形成更为细致的理解,当你能清楚的明白 BPU 的工作原理和信号细节时,便可以开始你的验证工作了!

最后修改 October 27, 2024: Fix typo (e95831c)