解析:
题目大意是
predict_valid = 1时,开始移位并且低位输入为predict_talen; train_mispredicted = 1时,将历史保存好的序列洗刷现在发现错误的序列,并且移位,低位输入为train_taken;
以上两个信号,发生冲突时,train_mispredicted的优先级更高。
有趣的是,这个历史保存好的信号也是个input,这就意味着不需要我们自己把predict的序列再复制到某个寄存器保存。
一开始没有想到这个点,把代码写复杂了,其实还是简单的。
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 if(predict_valid)begin
predict_history={predict_history[30:0],predict_taken};
end
end
end
endmodule