香山分支预测单元时序介绍
Categories:
一周期无空泡预测
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 的工作原理和信号细节时,便可以开始你的验证工作了!