一、总体架构分为六个阶段

二、fetch阶段
这是取指阶段。
看上图,IMEM存储指令。PC模块根据Gsahre分支预测结果发出要取的指令地址。
功能好理解,就是取指令。不过,加了个分支预测。
三、看实现细节

首先看PC,PC是32位的,其中的高28位给了IMEM,从IMEM中一次取出4条指令,一条指令是32bit,4个字节,那么一次性从IMEM也就是取出16个字节。
然后,由select logic负责从中挑选出两条指令,其实质是个选择器,控制信号是PC[3:2]这两位。
四、再来看select logic的实现细节,也就是4选2的规则是什么?

首先看到4条指令分别进入了两个选择器,选择器是4选1的,也就是输入4个指令输出一条指令。
然后分别看两个选择器的控制逻辑。
左边的选择器的控制信号是select 2bit,也就是上边的PC[3:2];
而右边的选择器的控制信号是select 2bit + 1,也就是PC[3:2}+1
所以,
当PC[3:2] = 00时,左边输出4条指令中第0个;右边输出4条指令中第1个。
当PC[3:2] = 01时,左边输出4条指令中第1个;右边输出4条指令中第2个
当PC[3:2] = 10时,左边输出4条指令中第2个;右边输出4条指令中第3个
当PC[3:2] = 11时,左边输出4条指令中第3个;右边输出4条指令中第0个(回滚)
五、输出的两条指令中第二条是不是有效?需要判断
最明显的情况就是:
当PC[3:2] = 11时,左边输出4条指令中第3个;右边输出4条指令中第0个(回滚)
第0个指令已经执行过了,显然此时输出的insn 2是无效的
还有一种情况就是:
当PC[3:2] = 01时,左边输出4条指令中第1个;右边输出4条指令中第2个。
这种情况下输出的insn 2也是无效的。
所以,当PC[3:2] = 2’b*1时,有invalid insn2,见四中的图的下半部分
六、到这里思路还是清晰的,总结下就是取指,不过是取四个选两个
七、下面学习fetch阶段的重点–Gshare分支预测
八、Gshare 分支预测器组成
-
BHR(Branch History Register,分支历史寄存器)
记录最近一段时间分支“跳/不跳”的历史。 -
PHT(Pattern History Table,模式历史表)
表中每个项是 2-bit 饱和计数器,用来给出 Taken / Not Taken 预测。 -
PC
取当前分支指令地址中的一部分位,与 BHR 一起生成索引。 -
BTB(Branch Target Buffer)
存放分支源地址和目标地址,用来在预测跳转时给出预测目标地址。
用一话总结:Gshare = BHR + PHT + PC异或索引 + BTB。

863

被折叠的 条评论
为什么被折叠?



