LAB 4
流水线的阻塞技术
我们先分析下这个三级流水线是如何阻塞的

assign pipe2_ready_go = ...
assign pipe2_allowin = !pipe2_valid || pipe2_ready_go && pipe3_allowin;
assign pipe2_to_pipe3_valid = pipe2_valid && pipe2_ready_go
always @(posedge clk) begin
if (rst) begin
pipe2_valid <= 1'b0;
end
else if (pipe2_allowa_in) begin
pipe2_valid <= pipe1_to_pipe2_valid;
end
if (pipe1_to_pipe2_valid && pipe2_allowain) begin
pipe2_data <= pipe1_data;
end
end
分析一下如果 pipe2_ready_go == 1'b0 时,即 pipe2 处被堵塞时的流水线会发生什么。
第一拍 pipe2_allowin , pipe2_to_pipe3_valid会为 0,于是 pipe1_allowin 和pipe1_to_pipe2_valid 会为0,如果有更前级的流水线,则全部阻塞,从第一拍开始全部不接受新值,直到 pipe2_

本文详细探讨了CPU三级流水线中如何处理阻塞问题,特别是当pipe2被堵塞时的流水线行为。分析了两种阻塞情况,一种是当前级未准备好,另一种是前级阻塞导致的。还讨论了如何通过valid信号控制无效数据对后续指令的影响,并指出在流水线中,只需控制译码阶段的ready_go信号即可避免寄存器写后读冲突。最后提到了实现策略,包括监测执行、访存和写回级的目的寄存器,以及修改DS的ready_go逻辑。
最低0.47元/天 解锁文章
986

被折叠的 条评论
为什么被折叠?



