We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rocket流水线分为5个阶段:IF, ID,EX, MEM, WB.五级顺序流水
控制流水线stall的有几个控制信号,take_pc_mem, take_pc_wb, killd, killx, killm等
rocket处理stall的方式比较简单,主要通过replay方式重执行这种比较粗暴的方法
The text was updated successfully, but these errors were encountered:
mem阶段如果有访存指令load,store发起取数请求,但是data miss,此时需要多个周期才会来数,此时流水线停止,rocket进行replay,直到再次在mem阶段取到数据,流水线再恢复。
mem阶段如果是分支跳转指令,会在此阶段判断是否后面预测的指令正确(在mem阶段计算出真正要跳转的pc,和EX阶段的指令pc进行对比),如果预测错误,那么take_pc_mem在这个周期置1,killd=1(这会阻断ID,和ex之间的指令传递), 此时killx=1,这个信号会把ex阶段的reg置位unvalid; 下一个周期,这条跳转指令到了WB阶段,会更新frontend下一周期要取的正确指令。并且此时killm变为1(因为上一周期ex的指令传递了过来(killex=1),使得mem阶段killm=1),这个信号 会把mem阶段的reg置位unvalid; 再下一个周期,ID从ibuf中取到正确的指令后,killd=0, 流水线开始恢复。 但是此时killx, killm还是为1,并且wb阶段的指令还是卡在那里。 后续的周期,killx,killm一级级恢复0,直到wb阶段的指令也被覆盖为正确的指令,流水线完全恢复,程序接着执行。
wb阶段要写回的寄存器和EX阶段要读取的寄存器相同,数据依赖,有冒险。此时take_pc_wb=1,killd=1,killx=1,之后演变类似第二种情况,wb阶段的那条指令又会replay到ID阶段重新执行一遍。。
wb阶段是条rocc指令,按道理在下一周期这条指令会被送到ROCC加速器那边,可是由于加速器握手信号ready=0,导致rocc指令阻塞在wb阶段,此时这条take_pc_wb=1,之后处理类似第三种情况,进行replay,直到加速器那边握手信号可以了,才能送过去。
Sorry, something went wrong.
前提,我将如下100f8 --1010c的指令伪装成rocc指令:
即将控制信号设置为: id_ctrl.rocc := true.B id_ctrl.wxd := false.B id_ctrl.branch := false.B id_ctrl.jal := false.B id_ctrl.jalr := false.B
id_ctrl.rocc := true.B id_ctrl.wxd := false.B id_ctrl.branch := false.B id_ctrl.jal := false.B id_ctrl.jalr := false.B
观察流水线各个周期现象如下:
解释: mem阶段如果是分支跳转指令(其实所有指令都会判断),会在此阶段判断是否后面预测的指令正确(在mem阶段计算出真正要跳转的pc(分支指令跳转pc计算方式是当前指令pc+立即数偏移;普通指令的话是+2或者+4 ),和EX阶段的指令pc进行对比),如果预测错误,那么take_pc_mem在这个周期置1,killd=1(这会阻断ID,和ex之间的指令传递), 此时killx=1,这个信号会把ex阶段的reg置位unvalid; 下一个周期,这条跳转指令到了WB阶段,会更新frontend下一周期要取的正确指令。并且此时killm变为1(因为上一周期ex的指令传递了过来(killex=1),使得mem阶段killm=1),这个信号 会把mem阶段的reg置位unvalid; 再下一个周期,ID从ibuf中取到正确的指令后,killd=0, 流水线开始恢复。 但是此时killx, killm还是为1,并且wb阶段的指令还是卡在那里。 后续的周期,killx,killm一级级恢复0,直到wb阶段的指令也被覆盖为正确的指令,流水线完全恢复,程序接着执行。
No branches or pull requests
概述:
rocket流水线分为5个阶段:IF, ID,EX, MEM, WB.五级顺序流水
控制流水线stall的有几个控制信号,take_pc_mem, take_pc_wb, killd, killx, killm等
rocket处理stall的方式比较简单,主要通过replay方式重执行这种比较粗暴的方法
The text was updated successfully, but these errors were encountered: