设计规范¶
本项目的 RTL 部分主要使用 Chisel 3 语言开发,并基于 Berkeley 的 Rocket Chip 处理器框架。项目开发中遵守的一般原则为:
- 尽量复用现有的功能组件,包括:
- Chisel 语言标准库:
ReadyValidIO标准握手接口、Queue队列等; - 现有的 Chisel 模块:Berkeley 的
hard-float、SiFive 的 L2 Cache 等; - 尽量封装同样功能的信号为
Bundle结构,避免重复定义; - 遵守的一致的代码命名规则,详细如下所述。
命名规范¶
本项目中,所有 Scala 代码默认需要遵守下面的命名规范:
- 文件命名使用下划线分隔的小写单词(如
thruster.scala,vector_unit.scala); - 类(
class) / 顶层对象(object) / 特征(trait)使用首字母大写的驼峰式命名(如ThrusterImp,AccumulateState,WithThruster); - 变量(
val/var)、类成员、方法(def)名使用首字母小写的驼峰式命名(如currentState,vectorLength); - 常量(如不会改变的
val)全部大写并以下划线分隔(如GLOBAL_RESET_VECTOR); - 某些对象需要冠以相应的首字母:
s代表枚举(一般用于状态机,如sIdle,sReset),d表示仅用于调试的变量(即不应该被综合)。
下划线的使用
由于 Scala 中嵌套的对象层级(如 module.io.ready)在 RTL 代码中会被转换为类似 module_io_ready 的扁平名称。为了避免混淆,所有变量命名中 不应该 包含下划线。
除此之外的更多细节,可以参照 Chisel Style Guide。当使用外部模块时,应当遵守它的命名。模拟器的命名规范应与 Scala 中尽量保持一致。
代码规范¶
Scala 代码还需要遵守下面的书写规范:
- 非必要情况(如层叠模块)避免使用
var声明变量,以免造成困惑; - 除顶层模块外,所有模块只包含至多一个命名为
io的向外暴露的接口(即不使用MultiIOModule); - 模块内不需要被外部访问的成员变量/方法应声明为
private(非class作用域则无需); - 常量必须放置在一个
object中(类伴生对象或者专门的对象,如枚举的状态); - 尽量添加必要的
assert和printf语句,以给仿真提供充分多的信息。
最后更新: March 26, 2020
作者: