指令获取
Zircon-2024的指令获取由F0、F1、F2三个流水级组成,负责访问ICache获取指令,并将指令送入到后续的预译码模块和取指队列中。如果Zircon-2024的预译码器或后端检测到预测错误,或分支预测器希望重定向,请求都会被发送到这里,并触发ICache的重新读取。
指令获取规则
由于需要支持超标量读取,因此指令获取部分必须能够根据PC值来动态读取不同数量的指令。为了分支预测BTB和ICache设计的简单性,Zircon-2024的指令获取部分给出了如下规定:
- 前端流水线的取指宽度必须为2的幂次。
- 若前端流水线的取指宽度为nfch,且PC值不4*nfch字节对齐,则只能从ICache中读取到距离下一个4*nfch字节对齐的地址。(例如,若取指宽度为4,且PC值为0x8000000C,则本次只能读取一条指令,PC自增4而非16)。
指令获取规则的性能损失分析
对于任意一个指令块,在后端流水线不出现任何阻塞的情况下,当且仅当指令块起始地址不为4*nfch字节对齐,且指令块长度恰好为nfch的倍数时,此规则下的指令获取才会在进入该指令块的那个周期损失1-3条指令的性能。鉴于在科学计算中,指令块长度往往非常大(例如使用循环展开),因此理论上这种损失可以忽略不计。而在实际的CoreMark性能测试中,作者发现这样的损失只会使将IPC的下降幅度限制在小数点后三位。