学习目标

  • 理解动态预测
  • 实现两位计数器
  • 提升预测准确率

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%!

下一步

第 6 章:全局历史预测

更新时间: