总览
Mill 中包含的示例 CPU(下称 CPU)实现了基本的 RV32I 指令集(包括特权态 M),实现语言是 SystemVerilog,仿真使用 Verilator,在 Vivado 2018.03 上可以通过综合。
CPU 采用四级流水线设计,单发射,支持异步访存。
// TODO: 喵喵的数位板呢?这里少张图!
和典型 MIPS 五级流水设计的区别
1. 访存 (Mem) 和执行 (Ex) 合并
原因在于我们不少那一个加法器。
事实上在示例 CPU 的实现中共有六个加法器:PC 自增,跳转偏移,返回地址计算,ALU ADD[I]
, ALU SUB
,以及访存有效地址计算。节约一个加法器不本质,而且 ALU 中至少就需要两个加法器(减法单独使用一个,或者计算补码使用一个)
好处在于可以不用 Mem -> Ex 回递。而且由于访存路径很长,Ex 逻辑又比较复杂,这个回递尤其卡脖子。
2. 分支在 Ex 出口生效
首先因为没有延迟槽,所以其实分支写在哪里都会涉及清空流水线的问题。
在 Ex 出口生效可以合并异常和分支的实现,让 nPC 的计算更简单。
示例 CPU 对流水级的实现做了部分约束,使得实现清空比较容易。具体见 实现细节。
最后更新: 2020-11-03 03:02:10