构建一个32位全局历史移位寄存器,包括支持回滚状态,以响应分支预测失误导致的管道刷新。
当进行分支预测时(predict_valid=1),从LSB侧移入predict_taken以更新预测分支的分支历史。(predict_history[0]是最年轻分支的方向。)
当发生分支预测失误时(train_mispredied=1),在预测失误的分支完成后,用历史加载分支历史寄存器。这是预测失误分支(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,posedge areset)
begin
if(areset)
predict_history<=0;
else
begin
if(train_mispredicted)
begin
predict_history<={train_history[30:0],train_taken};
end
else
begin
if(predict_valid)
predict_history<={predict_history[30:0],predict_taken};
end
end
end
endmodule