Zircon-Core 2024
Zircon 2024是Zircon系列第二代作品,面向基于RISC-V的科学计算应用开发。该处理器专注于用尽可能精简的资源支持非特权指令的高效执行,因此在一代作品的基础上,引进了更为激进的乱序执行策略、更强大的缓存系统和更高效的分支预测策略。同时,通过对一代作品的经验总结,作者在对整体处理器架构进行了一次彻底革新,通过更加“Chisel友好”的构建,进一步提升了开发效率,并获得了相较于一代20%的性能提升。
处理器架构
Zircon-2024是用Chisel硬件描述语言开发的可参数化RISC-V内核,创建于中国科学院大学。受到BOOM处理器 和《超标量处理器设计》(姚永斌 著)的启发,Zircon使用带旁路的Tomasulo算法,采用多发射、乱序执行、顺序提交的方式进行构建,其中取指、译码、执行宽度都可以通过参数配置。
从功能角度来看,Zircon-2024分为四个板块:前端(Frontend)、分派(Dispatch)、后端(Backend)和提交(Commit)。
在一条指令的生命周期中,指令会从前端经历取指操作进入流水线,离开前端后经由分派模块,按照其功能分配入后端不同的流水线中。后端流水线在执行完毕后,将结果写入重排序缓存,按顺序提交,从而离开流水线。
流水线阶段功能概要
从功能来看,Zircon-2024的流水线可以按照如下划分:
- 前端:取指(IF)、预译码(PD)、译码(DCD)、重命名(RNM);
- 分派:分派(DSP);
- 后端:发射(IS)、读寄存器(RF)、执行(EX)、写回(WB)
(提交与其余步骤不同步,故不在此列出)
但若从具体设计角度审视,有些流水级可以重叠并行,而有些流水级需要多级流水:
- 前端的译码(DCD)与重命名(RNM)可以合并为单个流水级(DCD/RNM)
- 访存流水线后端中,执行(EX)需要三个流水级,但其中第一个流水级可以与读寄存器(RF)合并(EX/RF)
- 乘除法流水线需要三个执行级(EX1、EX2、EX3)
取指(IF)
取指阶段是指从生成新的PC到指令从内存获取到指令的整个过程。由于ICache是三周期流水化访问的,因此该阶段横跨了三个时钟周期,但最后一个时钟周期可以看做与预译码(PD)重叠。分支预测也发生在此阶段,这个阶段发生的预测不会引入任何气泡。
预译码(PD)
预译码会在指令从ICache送出后、写入取指队列(FQ)前组合地执行。在分支预测器做出了无效预测,或预测显然错误时,预译码器会及时冲刷流水线,降低分支预测失败的损耗。
译码(DCD)
译码器从取指队列中获取指令,并生成操作码以组装向后流动的前端指令包。
重命名(RNM)
重命名器将指令里所有逻辑寄存器动态映射为物理寄存器,并记录映射关系。
分派(DSP)
分派器将前端指令包分派到能够处理该指令的后端发射队列中。
发射(IS)
发射仲裁器从发射队列中选取准备好的且最适合的指令,发射到后端流水线中。
读寄存器(RF)
后端指令包从物理寄存器堆中读取操作数。
执行(EX)
执行单元根据指令类型执行指令。对于Load/Store指令,这个阶段会访问DCache,读取/写入内存数据。
写回(WB)
写回单元将执行结果写入物理寄存器堆。
重排序缓存(ROB)
重排序缓存处理器提交提交模块,负责缓存执行完毕的指令,并按顺序提交。