大体上可以分为流出/发射、执行、写结果三步,下面举一个例子。

初始状态如下。由于指令队列中没有 store 指令,所以不需要 store 缓冲器。

cycle1,指令1流出(发射),load缓冲器中新增一条记录。34+R2表示要load的地址。同时寄存器状态表中,指令1的目的寄存器(F6)的状态更新为 load1(类似于一个指针,指向load缓冲器中的 load1)。

cycle2,
由于指令1是load,而load有两个时钟周期的延迟,所以在cycle3才会执行,cycle2不做什么事情。
同时指令2流出,load缓冲器中新增一条记录,寄存器状态表中 F2 的状态更新为 load2。

cycle3,
- 指令1经过2周期的延迟后进入执行阶段
- 指令2要经过2周期才进入执行阶段,因此不执行
- 指令3流出。
- 这是一条乘法指令,因此保留站中占用Multi1这一行。Op(操作类型)记为 MULTD(乘法);从寄存器状态表中可知,源寄存器1 F2 处于 Load2 状态,还没准备好,因此 \(Q_j=Load2\);源寄存器2 F4 处于空闲状态,已经准备好了,因此 \(V_k =R(F_4)\),即 \(V_k\) 被填充为寄存器 F4 的值。
- 寄存器状态表中 F0 的状态设为 Mult1,相当于一个指针,指向保留站中 Mult1 这一行。
\(j,k\) 分别代表源寄存器1和源寄存器2,\(V\) 代表已经准备好,\(Q\) 代表还没准备好。因此,
- \(V_j\) 表示源寄存器1已经准备好
- \(V_k\) 表示源寄存器2已经准备好
- \(Q_j\) 表示源寄存器1还没准备好
- \(Q_k\) 表示源寄存器2已经准备好

cycle4,
指令1刚刚执行完,需要写入结果,因此寄存器状态表中 F6 的值被更新为 M(34+R2),即地址R2+34处的值(实际上应该设置为空,但为了方便,记录其值)。同时清空 load 缓冲器中的记录 load1,因为第1条指令已经执行完了。
指令2经过2周期的延迟后进入执行阶段。
指令3,由于保留站中 Mult1 这一行的 \(Q_j=Load2\),说明还没有准备好,因此不会进入执行阶段。
指令4流出。
- 它是一条减法指令,会占用保留站中 Add1 这一行(加法减法同宗同源)。查询寄存器状态表可知,源寄存器1 F6 的值已经准备好,因此 \(V_j=M(34+R_2)\),而源寄存器2 F2 尚处于 Load2 状态,还没准备好,因此 \(Q_k=Load2\)。
- 寄存器状态表中 F8 的状态设为 Add1。

cycle5,
- 指令2刚刚执行完,需要写入结果,load缓冲器中Load2这一行清空,同时更新寄存器状态表中
F2 的状态。之前 F2 的状态是 Load2,此时需要把 F2
的值广播到所有填了Load2的地方。广播是通过CDB(公共数据总线)实现的。具体有2个地方填了Load2:
- 保留站Add1这一行,本来 \(Q_k\) 填了 Load2,现在 F2 的值准备好了,于是 \(Q_k\) 清空,\(V_k\) 填充为新的 F2 的值 \(M[45+R_3]\)。此时 Add1 这一行两个源寄存器都准备好了(\(V_j\),\(V_k\) 都有值),进入倒计时(左边时间那一列写着2,因为加法操作要延迟2个周期)
- 同理,保留站Mult1这一行,清空 \(Q_j\),并设 \(V_j=M[45+R_3]\)。这一行两个源寄存器也都准备好了,进入倒计时(乘法需要延时10个周期)
- 指令3,4进入倒计时,如前所述。
- 指令5流出。
- 保留站 Mult2 这一行新增一条记录(乘法除法同宗同源),其中源寄存器1 F0 的状态为 Mul1,尚未准备好;源寄存器2 F6 的状态为 \(M[43+R_2]\),准备好了,因此分别设置 \(Q_j\),\(V_k\) 的值。
- 寄存器状态表中 F10 的状态标记为 Multi2。

cycle6,
- 指令3,4的倒计时-1
- 指令5由于源寄存器还没准备好,阻塞
- 指令6流出,占用保留站 Add2 这一行,\(V_k\),\(Q_j\) 的赋值不再赘述。同时目的寄存器 F6 的状态设置为 Add2。

cycle7,
- 保留站Add1这一行(对应指令4)倒计时归零,指令4进入执行阶段。
- 指令3在等倒计时,阻塞
- 指令4,6的源寄存器还没准备好,阻塞

cycle8,
- 指令4进入写回阶段。
- 寄存器F8的状态更新为计算得到的值,这里用 \(M[]-M[]\) 表示。
- 保留站中Add1这一行清空。
- 把所有填了 Add1 的地方(这里只有 Add2 这一行的 \(Q_j\) 填了 Add1)替换为 F8 的新值,并更新 \(V_j\)。(即前面说的广播机制)
- 此时 Add2 这一行两个源寄存器都准备好了,进入倒计时。
- 指令3,5,6要么在等倒计时,要么源寄存器还没准备好

cycle9,只有倒计时,无事发生

cycle10,保留站Add2这一行(对应指令6)倒计时归零,进入执行阶段。其它只有倒计时-1,无事发生。

cycle11,保留站Add2这一行(对应指令6)开始写回,寄存器 F6 的状态更新,同时保留站Add2这一行清空。由于保留站中没有Add2标记,因此不需要广播。

cycle12,只有倒计时-1,无事发生。

快进到cycle15,保留站 Mult1 这一行(对应指令3)终于倒计时清零,进入执行阶段。其它无事发生。

cycle16,指令3刚刚执行完,进入写回阶段。寄存器 F0 的状态更新为计算出的结果,同时保留站中 Mult2 这一行的两个源寄存器也准备好了,更新 \(V_j\),并进入倒计时阶段(除法需要40个周期的延迟)

快进到cycle56,保留站 Mult2 这一行(对应指令6)终于倒计时归零,进入执行阶段。

cycle57,保留站 Mult2 这一行(对应指令6)进入写回阶段,寄存器 F10 的状态更新为计算出的结果,同时保留站 Mult2 这一行清空。

至此,这六条指令就执行完了,可以看到它们是乱序执行的,顺序为1→2→4→6→3→5,总共使用57个周期。