ResearchNote icon indicating copy to clipboard operation
ResearchNote copied to clipboard

rocketchip学习笔记5: 流水线stall流程

Open meton-robean opened this issue 5 years ago • 2 comments
trafficstars

概述:

  • rocket流水线分为5个阶段:IF, ID,EX, MEM, WB.五级顺序流水

  • 控制流水线stall的有几个控制信号,take_pc_mem, take_pc_wb, killd, killx, killm等

  • rocket处理stall的方式比较简单,主要通过replay方式重执行这种比较粗暴的方法

meton-robean avatar Dec 16 '19 03:12 meton-robean

几种情况rocket会stall:

  • 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,直到加速器那边握手信号可以了,才能送过去。

meton-robean avatar Dec 16 '19 03:12 meton-robean

以一个例子来说明:

前提,我将如下100f8 --1010c的指令伪装成rocc指令:

Selection_018

即将控制信号设置为: 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

观察流水线各个周期现象如下: WeChat Image_20191216122305

解释: 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阶段的指令也被覆盖为正确的指令,流水线完全恢复,程序接着执行。

meton-robean avatar Dec 16 '19 04:12 meton-robean