ROB


引述自:《超标量处理器设计》p_323

ROB本质上是一个FIFO,在它当中存储了一条指令的相关信息,如果这条指令的类型、结果、目的寄存器和异常的类型等,如下图所示:

ROB的容量决定了流水线中最多可以同时执行的指令个数,在上图中,每个ROB的表项包括:

1)complete:表示一条指令是否已经执行完毕;

2)Areg:指令在原始程序中指定的目的寄存器,它以逻辑寄存器的形式给出;

3)Preg:指令的Areg经过寄存器重命名之后,对应的物理寄存器的编号;

4)OPreg:指令的Areg被重命名为的新的Preg之前,对应的旧的Preg,当指令发生异常而进行状态恢复时,会使用到这个值;

5)PC:对应这条指令的PC值,当一条指令发生中断或异常时,需要保存这条指令的PC值,以便能够重新执行程序;

6)Exception:如果指令发生了异常,会将这个异常的类型写到这里,当指令要退休的时候,会对这个异常进行处理;

7)Type:指令的类型会被记录到这里,当指令退休的时候,不同类型的指令会有不同的动作,例如store指令要写D-Cache、分支指令要释放checkpoint资源等。

在流水线的分发(Dispatch)阶段,指令会按照流水线的顺序写到ROB中,同时ROB中对应的complete状态位会被置为0,表示这些指令没有执行完毕,在以后的某个时间,当某条指令执行结束了,它就变为complete状态,此时会将ROB中对应的complete状态位置为1,这条指令的计算结果可以放在ROB中,也可以放在物理寄存器堆中,这取决于架构的实现。一条指令在执行的过程中如果发生了异常,也会将异常的类型记录在ROB中,异常的处理会统一放在流水线的提交阶段。指令一旦在流水线的分发阶段占据了ROB中的一个表项,这个表项的编号会一直随着这条指令在流水线中流动,这样指令在之后的任何时刻,都可以知道如何在ROB中找到自己。

 

一旦一条指令的变为ROB中最旧的指令(上图中,以head pointer来指示最旧的指令),且其complete状态位为1,就表示这条指令已经具备退休(retire)的条件。如果这条指令在之前没有发生过异常,即它在ROB中对应的exception部分为0,这这条指令可以顺利地离开流水线,它的结果可以对处理器的状态进行更新;如果这条指令发生过异常,那么它就要启动异常的处理过程;而且在这条指令之后进入流水线的所有指令多不允许退休了,此时需要将这些指令从流水线中抹掉,并且对处理器进行状态恢复,然后从指定的地址开始重新取指令执行。在流水线提交阶段,如果是store指令,则它只在退休的时候才可以真正地改变处理器的状态(写D-Cache),如果在该过程中发生了D-cache缺失,store指令会阻碍流水线中所有位于它后面的指令继续退休。

一条指令的异常要被处理,必须保证在它之前的多有指令的异常都已经被处理完成了。

 

有个疑问:如果一条指令在读数据时,相应的IP没有反应(即读数据一直没有完成),应如何处理????


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM