第 5 章:两位饱和计数器
学习目标
- 理解动态预测
- 实现两位计数器
- 提升预测准确率
5.1 思考:如何记住历史?
每个分支指令有自己的行为模式,能否记住它的历史?
解决方案:为每个分支维护一个状态!
5.2 两位饱和计数器
11 (强跳转) ←→ 10 (弱跳转)
↑ ↓
01 (弱不跳) ←→ 00 (强不跳)
状态转移:
- 跳转:计数器 +1(饱和到 11)
- 不跳转:计数器 -1(饱和到 00)
预测:计数器 >= 10 则预测跳转
5.3 实现
reg [1:0] bht [255:0]; // 256 项预测表
wire [7:0] index = pc[9:2];
wire predict = bht[index][1];
// 更新
always @(posedge clk) begin
if (branch_commit) begin
if (taken && bht[index] != 2'b11)
bht[index] <= bht[index] + 1;
else if (!taken && bht[index] != 2'b00)
bht[index] <= bht[index] - 1;
end
end
思考:为什么用 PC 的 [9:2] 位做索引?
5.4 效果
准确率可达 ~85%!