假设:

cycle0,初始状态

cycle1,指令1发射,ROB 中新增一条记录。load 缓冲器中新增一条记录,地址记为 \(Regs[R_2]+34\)。寄存器 F6 的状态设置为 #1(即Load1)。

cycle2,
- 指令1进入执行阶段
- 指令2发射,ROB表中新增一条记录。load缓冲器中也新增一条记录。寄存器 F2 的状态设置为 #2。

cycle3,
- 指令1写回,保留站中删除这条记录。但由于还没提交,所以寄存器 F6 的状态不变。
- 指令2开始执行。
- 指令3开始发射,ROB中新增一条记录,同时保留站中 Mult1
这一行新增一条记录。
- F2 还没准备好,所以 \(Q_j=\#2\)。
- F4 准备好了,所以 \(V_k=Regs[F4]\)。

cycle4,
- 指令1提交,寄存器 F6 的状态更新为”unbusy“,即清空。同时保留站中所有标了 #1 的地方都要替换为 F6 的值,但保留站中没有标 #1,所以不变。
- 指令2写回,
- 保留站中 Load2 这一行清空。
- 寄存器 F2 的结果被广播到所有的 #2,因此保留站中Mult1这一行 \(V_j=Mem[45+Regs[R_3]\)。
- 但由于还未提交,所以寄存器 F2 的状态不变。
- 指令3发现两个操作数都准备好了,开始倒计时(按照之前的约定,乘法共需20周期)。但此时尚未进入执行,仍处于发射阶段。
- 指令4发射,
- 寄存器 F8 的状态设置为 #4。
- 寄存器 F6 已准备好,所以 \(V_j=Regs[F_6]\)。
- 寄存器 F2 已准备好(虽然它的状态还是 #2,但只是没提交而已),所以 \(V_k=Mem[45+regs[R3]]\)。
- 因此两个操作数都准备好了,进入倒计时。但此时尚未进入执行,仍处于发射阶段。

这里图片应该错了,保留站Add1这一行的 \(Q_k\) 应该是空的
cycle5,
- 指令2提交,寄存器 F2 的状态终于更新为unbusy。
- 指令3进入执行阶段的第1周期(Ex1),同时倒计时-1。
- 指令4也进入执行阶段的第1周期,同时倒计时-1。
- 指令5发射,
- 占用保留站Mult2这一行。
- F0 尚未准备好,所以 \(Q_j=\#3\)。
- F6 准备好了,所以 \(V_k=Regs[F_6]\)。

cycle6,
- 指令3继续执行,倒计时-1
- 指令4继续执行,倒计时-1
- 指令5等待 F0 的结果,不动
- 指令6发射,
- 占用保留站 Add2 这一行
- 寄存器 F6 的状态设为 #6
- 寄存器 F8 还没准备好,所以 \(Q_j=\#4\)
- 寄存器 F2 准备好了,所以 \(V_k=Regs[F_2]\)

cycle7,
- 指令3仍在执行,倒计时-1
- 指令4在上一周期执行完毕,此周期进入写回阶段。把寄存器 F8 的值广播到所有写了 #4 的地方。
- 指令5仍在等待 #3
- 指令6的两个操作数都准备好了,开始倒计时

cycle8,
- 指令3仍在执行,倒计时-1
- 指令4不能提交,因为在它之前的指令3还没提交,所以寄存器 F8 的状态仍为 #4
- 指令5仍在等待 F0 的结果
- 指令6开始执行,倒计时-1

cycle9,
- 指令3仍在执行,倒计时-1
- 指令4还是不能提交,保持写回状态
- 指令5仍在等待 F0 的结果
- 指令6执行完毕,倒计时归零

cycle10,
指令3仍在执行,倒计时-1
指令4仍在等待指令3提交
指令5仍在等待寄存器 F0 的值
指令6执行结束,进入写回阶段,寄存器 F6 的值广播到所有 #6 的地方,但这里似乎没有

快进到cycle14,指令3执行完毕
cycle15,
- 指令3开始写回,寄存器 F0 的值广播到所有 #3 的地方
- 指令4等待指令3提交
- 指令5发现两个操作数都准备好了,开始倒计时
- 指令6还不能提交

cycle16,
- 指令3提交,寄存器 F0 的状态更新为unbusy
- 指令4继续等待
- 指令5开始执行,倒计时-1
- 指令6继续等待

cycle17,
- 指令4终于可以提交,寄存器 F8 的状态更新为 unbusy
- 指令5继续执行,倒计时-1
- 指令6继续等待

快进到cycle55,指令5执行完毕,倒计时归零
cycle56,
- 指令5写回,寄存器 F10 的值广播到所有 #5
- 指令6等待指令5提交

cycle57,指令5提交,寄存器 F10 的状态更新为 unbusy
cycle58,指令6提交,寄存器 F6 的状态更新为 unbusy
至此,执行结束!