学习目标

  • 实现分支目标缓冲
  • 设计返回地址栈
  • 优化间接跳转

7.1 思考:还缺什么?

预测了方向,但跳转目标地址呢?

问题:如何在取指阶段就知道目标地址?

7.2 分支目标缓冲(BTB)

reg [31:0] btb_pc [255:0];
reg [31:0] btb_target [255:0];
reg btb_valid [255:0];

wire [7:0] btb_index = pc[9:2];
wire btb_hit = btb_valid[btb_index] && 
               (btb_pc[btb_index] == pc);
wire [31:0] predict_target = btb_target[btb_index];

7.3 返回地址栈(RAS)

函数调用模式:

jal ra, func   # 压栈
...
ret            # 出栈
reg [31:0] ras [7:0];
reg [2:0] ras_top;

// 调用:压栈
if (is_call)
    ras[ras_top] <= pc + 4;

// 返回:出栈
if (is_ret)
    predict_target <= ras[ras_top - 1];

思考:为什么函数返回需要特殊处理?

下一步

第 8 章:Cache 原理

更新时间: