构建 32 位全局历史记录移位寄存器,包括支持回滚状态以响应由分支错误预测引起的管道刷新。
进行分支预测 ( = 1) 时,从 LSB 端移入以更新预测分支的分支历史记录。(是最年轻的分支的方向。predict_valid
predict_taken
predict_history[0]
当发生分支错误预测 ( = 1) 时,在完成错误预测的分支后,将分支历史记录寄存器与历史记录一起加载。这是错误预测的分支 () 与分支 () 的实际结果连接之前的历史记录。train_mispredicted
train_history
train_taken
如果预测和错误预测同时发生,则错误预测优先,因为管道刷新也会清除当前正在进行预测的分支。
predict_history
是分支历史记录寄存器的值。
areset
是将历史记录计数器重置为零的异步重置。
module top_module(
input clk,
input areset,
input predict_valid,
input predict_taken,
output [31:0] predict_history,
input train_mispredicted,
input train_taken,
input [31:0] train_history
);
always @ (posedge clk or posedge areset) begin
if (areset)
predict_history = 32'd0;
else if (train_mispredicted)
predict_history = {train_history[30:0],train_taken};
else if (predict_valid)
predict_history = {predict_history[30:0],predict_taken};
else
predict_history = predict_history;
end
endmodule