计分板记录着所有必要的信息,用来控制以下事情:
需要强调的是,计分板算法和普通的流水线是不一样的,一般我们讨论的普通的五级流水线只有一个ALU,所以当一条指令在使用ALU时,其它指令是没法进入EXE阶段的,但是计分板算法不一样,它有多个功能部件,如果指令使用的是不同的功能部件,是能同时进入EXE阶段的。同理,计分板算法对寄存器堆的读取也是可以多条指令同时进行的,但是普通流水线是只有一条指令能访问,普通流水线和计分板算法一样的是一个cycle最多发射一条指令。下面的计分板示例流程会说明计分板算法的特点。
Issue阶段通过停顿整个流水线所有级解决WAW冲突。
Read operands通过监控源操作数是否可获得(available)来判定这个指令是否能执行以解决RAW冲突,这只会造成单条指令的停顿,流水线还是能继续
Write result阶段如果有数据需要写回,计分板会先判断是否有先前的指令在读这个数据且还没读完,通过引入停顿的方式解决WAR冲突,这只会造成单条指令的停顿,流水线还是能继续
注意cycle1阶段,发射的时候就已经知道源和目标操作数以及源和目标操作数是否准备好,并不需要等到Read operands阶段。
Cycle2时,因为Read oprands操作,读取完操作数后把Rj从Yes变成No,使得其他指令没法对R2进行写,这样可以避免WAR冲突。同时由于Interger部件被占用,第二条指令及后面的流水线全部停顿直至第一条指令执行完毕。
注意:cycle5阶段,虽然第一个条指令已经过了excution阶段到了write result阶段,但是第二条load指令并不会发射,只能在下一个周期发射。且注意write result阶段会把计分板中和这条指令相关的所有功能部件状态及寄存器状态清空
注意:cycle11是可以一次读取两个oprands的,MUL和SUB指令同时在这个时钟周期读取了操作数。
注意:cycle12、cycle13中不同的指令可以利用不同的功能部件同时执行,MUL和SUB指令同时在这两个时钟周期处理了操作数。
注意,cycle14阶段,最后一条ADD指令只会在SUB写回的下一个周期才开始发射
注:cycle23阶段,DIV读完操作数ADD就可以写回了。