第 7 章:BTB 和 RAS
学习目标
- 实现分支目标缓冲
- 设计返回地址栈
- 优化间接跳转
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];
思考:为什么函数返回需要特殊处理?