派遣 Dispatch
在香山处理器中,派遣部分逻辑实际上共包括两级流水级,第一级 Dispatch
负责将指令分类并发送至定点、浮点与访存三类派遣队列(Dispatch Queue),第二级 Dispatch2Rs
负责将对应类型的指令进一步根据不同的运算操作类型派遣至不同的保留站。
目前,派遣阶段整体的逻辑较长且复杂,仍然有很大的优化空间。
第一级 Dispatch
第一级派遣的源码在 Dispatch.scala
,其中包含了对不同指令类型的判断、对每一条指令是否能够进入下一级的判断以及对 BusyTable 的置位(指令会在这一流水级把它的目的寄存器状态置为无效)。
需要注意的是,出于时序考虑,我们简化了指令可以继续进入下一级的条件。目前,当且仅当所有资源都是充足的(派遣队列有足够空项、ROB 有足够空项等),指令才能够进入下一级。也就是说,定点指令可能会因为浮点派遣队列满而被阻塞。
派遣队列 Dispatch Queue
派遣队列是第一级与第二级的桥梁,其中存放了一部分指令。在分支预测等重定向请求发生时,这个队列中的指令存在一定的可能性被刷 / 不能被刷,因此队列逻辑中还包含了对 robIdx
的取消判断。
第二级 Dispatch2Rs
第二级派遣负责的是根据不同的指令类型、不同的保留站可接受的指令类型,对指令做一个路由,将它们发送到不同的保留站。目前,我们实现了几种简单的派遣策略,且参数化系统还未完整测试。