论文地址:https://ieeexplore.ieee.org/document/491460
MIPS R10000 是动态超标量RISC处理器,是为克服性能限制(存储带宽和时延)而设计的,它在每个时钟周期可以取值和编码4条指令,并且能够动态的将他们发送到5级完全流水、低时延的时钟单元中。它拥有4项分支栈,可以在分支之前预测式的执行。采用动态乱序执行技术,尽管指令的执行是无序的,但是指令是按顺序逐步完成的,处理器能提供连续的内存一致性和精确的异常处理。它采用层次化的,非阻塞式的存储子系统,能够通过两级组相连写回式高速缓存隐藏存储时延,同时使用映射表完成寄存器重命名。下面将针对几个重要功能实现及逻辑展开论述:
指令编/解码
处理器每个时钟周期取4条指令,使用16字高速缓存行的任意对齐方式下并行取指令-通过修改高速缓存的读出放大器实现。在第二阶段,处理器并行解码映射4条指令,并在第三阶段将指令写入适当的队列。每个周期解码4条指令,因此需要4个独立的解码器,除乘法和除法指令外的其他指令一般不需要超过一个结果的寄存器。结构冒险或者特殊指令引起的未及时解码的指令仍要留在8字指令缓存中。
Branch Unit(分支单元)
分支指令发生频率较高,并且需要快速执行。因此处理器预测一个条件分支的方向,并沿着预测的路径推测式的取指令,这种预测使用一个基于512项分支历史表(BHT-Branch History table)的2位算法。当程序执行需要跳转或者分支时,引入一个“分支气泡”周期,在这个周期中R10K不解码任何指令。
当解码一个分支时,处理器通过4目分支栈来保存它的状态,它会替换分支地址同时备份整形和浮点寄存器映射表。如果分支预测不正确,处理器会立刻停止所有沿着错误路径获取的指令,并从分支栈当中恢复它的状态。每条指令对应的4位分指标记用于表明待处理非分支是否预测正确等信息。
为什么要引入分支气泡周期:
该处理器没有重定向指令获取,直到在第二个流水线级(解码)中检测到分支,因此即使具有正确的预测,所采用的分支也引入了一个循环气泡。在某些周期之后可能无法确定不正确的预测,因为执行在第四个流水线阶段开始,并且指令是无序执行的。(错误预测的已采用分支可能会解码已采取的分支气泡中已获取的指令,因为这些指令存储在“恢复缓存”中。)流水线中,分支指令执行时因为确定下一条指令的目标地址(紧随其后 or 跳转目标处?)一般要到第 2 级以后,在目标确定前流水线的取指级是不能工作的,即整个流水线就“浪费”(