大家好,我们团队的名字是真芯为你,参赛编号是CICC2886,这次来分享基于全局预测历史的gshare分支预测器的实现细节.
GShare预测机制作为一种常用的分支预测机制,通过基于分支历史和分支地址来预测分支指令的执行路径。分支历史是指处理器在执行程序时遇到的所有分支指令的执行情况,包括它们是否被执行以及它们的起跳地址。分支地址是指该条件分支指令的PC值。
下图为GShare分支预测机制的原理流程图。
当处理器执行到分支指令时,GShare预测模块可以将分支历史和分支地址结合起来,生成一个索引,用于查询方式历史表(PHT)中的条目。这个索引既能简单地通过异或操作来实现,也能使用更为复杂地运算操作生成。考虑到采用更复杂的运算可能会导致延时过高而出现时序违背问题,我们最后选择只进行简单的异或操作以生成表索引。PHT由一组2-bit计数器构成,其中每个条目都包含一个2-bit计数器,通过查询索引指向条目中的2-bit计数器中的数,生成相应的预测结果,若查询到的数大于2’b01则预测结果为“taken”,否则为“not taken”。
下图为GShare分支预测的具体架构图。
主要模块有:
分支历史寄存器本身并不会占用很多资源,但是其位数决定了方式历史寄存器的地址位数,虽然BHR位数越多,分支预测器的准确度越高,但正确率提高的代价是PHT消耗的资源呈指数形式迅速地增长,因此我们必须在面积与性能之间进行权衡。。最终经过对各类32位RISC-V开源处理器内核的调研,我们将BHR的位数定为10位,具有10位BHR的GShare分支预测器既能保证较高的预测正确率,又能照顾到实现面积。
PHT模块由两个简单双端口RAM构成,如下图所示。
其中RAM的读写地址与BHR位数相适配,通过将压缩的PC值(PC[2+:10])与10位BHR进行异或运算得到。PHT的主要功能是在IF阶段可以依据地址raddr_if读取pht0中对应的2-bit计数器的状态值,同时在EX阶段可以依据raddr_ex读取pht1中对应的2-bit计数器的状态值。
PHT写入内容实际上是索引下2-bit计数器的状态值,这一状态值可以用状态机转换的方式获取,也可以用简单的增减运算得到。
更新BHR值有两种方式,第一种是在取指阶段直接对BHR进行更新,第二种则是在执行阶段等到确认交付后再对BHR进行更新。第一种方式的优点是假如出现了连续遇到两条分支指令的情况,后一条分支指令可以享受到前一条指令的分支历史结果。但缺点就是会存在预测失败导致BHR中更新的内容不正确,这时必须要先对BHR进行回滚操作,恢复到错误前的状态。第二种方式的优点是不会出现BHR中更新内容不正确的情况,因为所有的更新操作都是在指令交付后进行的。缺点是在遇到连续的两条分支指令时,后一条指令无法享受前一条指令的预测结果。
预测跳转结果为“taken”的条件为命中BTB同时在取值阶段从pht0中读出的2-bit计数器状态值大于2’b01。。命中BTB意味着该PC所指向的指令为一条分支指令并且曾被执行过,假如将命中BTB这一条件修改为简单译码出该指令为一条条件分支指令(minidec_bxx)也是可行的,虽然这跟原本的GShare预测机制有些许不同,但在之后的实验仿真中,这两种处理方法均可得到不错的分支预测正确率。