假设:

554eb7cf63b63ba4bf4c18a2a1e34226

cycle0,初始状态

image-20260524164622545

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

image-20260524164927723

cycle2,

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

image-20260524165157986

cycle3,

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

image-20260524165640450

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]]\)
    • 因此两个操作数都准备好了,进入倒计时。但此时尚未进入执行,仍处于发射阶段。

image-20260524170151551

这里图片应该错了,保留站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]\)

image-20260524171731458

cycle6,

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

image-20260524172142627

cycle7,

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

image-20260524172445884

cycle8,

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

image-20260524172707125

cycle9,

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

image-20260524173052301

cycle10,

  • 指令3仍在执行,倒计时-1

  • 指令4仍在等待指令3提交

  • 指令5仍在等待寄存器 F0 的值

  • 指令6执行结束,进入写回阶段,寄存器 F6 的值广播到所有 #6 的地方,但这里似乎没有

image-20260524173328532

快进到cycle14,指令3执行完毕

cycle15,

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

image-20260524173600228

cycle16,

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

image-20260524173756218

cycle17,

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

image-20260524173910652

快进到cycle55,指令5执行完毕,倒计时归零

cycle56,

  • 指令5写回,寄存器 F10 的值广播到所有 #5
  • 指令6等待指令5提交

image-20260524174103942

cycle57,指令5提交,寄存器 F10 的状态更新为 unbusy

cycle58,指令6提交,寄存器 F6 的状态更新为 unbusy

至此,执行结束!