跳转至

设计规范

本项目的 RTL 部分主要使用 Chisel 3 语言开发,并基于 Berkeley 的 Rocket Chip 处理器框架。项目开发中遵守的一般原则为:

  • 尽量复用现有的功能组件,包括:
  • Chisel 语言标准库:ReadyValidIO 标准握手接口、Queue 队列等;
  • 现有的 Chisel 模块:Berkeley 的 hard-float、SiFive 的 L2 Cache 等;
  • 尽量封装同样功能的信号为 Bundle 结构,避免重复定义;
  • 遵守的一致的代码命名规则,详细如下所述。

命名规范

本项目中,所有 Scala 代码默认需要遵守下面的命名规范:

  • 文件命名使用下划线分隔的小写单词(如 thruster.scalavector_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 中(类伴生对象或者专门的对象,如枚举的状态);
  • 尽量添加必要的 assertprintf 语句,以给仿真提供充分多的信息。

最后更新: March 26, 2020
作者: Harry Chen