A.6 实验六 再定序缓冲(ROB)工作原理
A.6.1 实验目的
1. 加深对指令级并行性及其开发的理解。
2. 加深对基于硬件的前瞻执行的理解。
3. 掌握ROB在流出、执行、写结果、确认4个阶段所进行的操作。
4. 掌握ROB缓冲器的结构。
5. 给定被执行代码片段,对于具体某个时钟周期,能写出保留站、ROB以及浮点寄存器状态表内容的变化情况。
A.6.2实验平台
实验平台采用再定序缓冲ROB模拟器。
环境的建立:见A.0。
A.6.3 实验内容及步骤
首先要掌握ROB模拟器的使用方法(见A.6.4节)。
1. 假设浮点功能部件的延迟时间为加法2个时钟周期,乘法10个时钟周期,除法40个时钟周期,Load部件2个时钟周期。
(1)对于下面的代码段,给出当指令MUL.D即将确认时保留站、ROB以及浮点寄存器状态表的内容。
L.D F6, 24(R2)
L.D F2, 12(R3)
MUL.D F0, F2, F4
SUB.D F8, F6, F2
DIV.D F10, F0, F6
ADD.D F6, F8, F2
(2)按步进方式执行上述代码,利用模拟器的“小三角按钮”的对比显示功能,观察每一个时钟周期前后保留站、ROB以及浮点寄存器状态表的内容的变化情况。
2.对于与上面相同的延迟时间和代码段:
(1) 给出在第5个时钟周期时,保留站的内容。
(2) 步进5个时钟周期,ROB的内容有哪些变化?
(3) 再步进5个时钟周期,给出这时保留站、ROB以及浮点寄存器状态表的内容。
3. 假设浮点功能部件的延迟时间为加减法3个时钟周期,乘法8个时钟周期,除法40个时钟周期。自己编写一段程序(要在实验报告中给出),重复上述步骤2的工作。
A.6.4 ROB模拟器的使用方法
1. 设置指令和参数
本模拟器最多可以模拟10条指令。可以在“指令”区选择和设置所要的指令。“指令”区如图A.6.1所示。

图A.6.1 “指令”区
你可以从下拉框中选择指令,供选择的指令有以下5种:
(1)L.D指令:从主存读取一个双精度浮点数;
(2)ADD.D:双精度浮点加法指令;
(3)SUB.D:双精度浮点减法指令;
(4)MULT.D:双精度浮点乘法指令;
(5)DIV.D:双精度浮点除法指令。
指令的各参数也可以从各自的下拉框中选择。
你还可以在窗口的右上区域设置各部件的执行时间(时钟周期数),如图A.6.2所示。

图A.6.2 设置功能部件时间
其中“复位”的作用是使所有设置恢复为默认值。
2. 执行
点击“执行”按钮,就进入执行状态。你可以用中间的按钮来控制指令的执行,包括“步进”、“退1步”、“前进5个周期”、“后退5个周期”、“执行到底”、“退出”等。还可以用“go”按钮直接跳转到你所指定的时钟周期。如果想修改被执行的代码,按“退出”按钮,即可回到设置指令和参数页面。
向前执行后,状态表中抹色的字段表示其内容发生了变化。
3. 对比状态表
每一个状态表的右上角外侧都有一个小三角,用鼠标左键点击它,会弹出该表在上一个时钟周期的内容。这是为了让你通过对比来了解哪些内容发生了变化。在弹出表以外的区域再次点击鼠标,就可以将其收回。
4. 各个表的内容
(1) 指令状态表
指令状态表如图A.6.3所示。它列出了各指令什么时候执行到了哪一步。其中的数字表示时钟周期,“~”表示时钟周期期间。例如,图A.6.3中的2~3表示在第2到第3个时钟周期,第一条L.D指令是在“执行”这一步。 
图A.6.3 指令状态表
其中抹色的区域表示最近一个时钟周期其内容发生了变化。下同。
(2) 再定序缓冲器ROB
ROB如图A.6.4所示。它按队列方式工作,其中各字段的意义如下:
u 标记:用于给出队列的头和尾;
u 项号:给出各项的编号;
u Busy:“忙”标志,指出相应的行是否已占用;
u 指令:给出是什么指令占用该行;
u 目的地:指出结果写到哪里去;
u 值:暂时存放相应指令的计算结果,在该指令被确认时,将被写到目的地。

图A.6.4 再定序缓冲器ROB
(3) 保留站
保留站的内容如图A.6.5所示。

图A.6.5 保留站
其中各字段的名称和意义与图A.5.4中的相同。不过,这里增加了一个字段:目的地。它指出相应部件的运算结果要暂时存放到ROB的第几号单元。
(4) Load缓冲器
Load缓冲器的内容如图A.6.6所示。它按队列方式工作,每次处理新的访存都是从队列头部取走一条。

图A.6.6 Load缓冲器
该缓冲器各字段的意义如下:
u 名称:相应单元的名称;
u Busy:“忙”标志,为“Yes”表示已被占用;
u 地址:访存的有效地址;
u 目的地:指出从存储器读来的数据要暂时存放到ROB的第几号单元;
u 值:存放从存储器读来的数据。
(5) 寄存器
寄存器的内容如图A.6.7所示。

图A.6.7 寄存器的内容
该缓冲器各字段的意义如下:
u Busy:“忙”标志,为“Yes”表示将有指令要对该寄存器写入数据;
u ROB项号:指出它在等哪个ROB项的数据。当那个ROB项中的指令被确认且其值已经就绪时,那个数据将被写入该寄存器;
u 值:寄存器的值。
当上述表中的内容写不下时,模拟器会采用缩写的方法。这时,在屏幕上面中间的区域中会显示缩写及其值。

