首先弄清楚这三者的关系。
Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性[1]。
Chisel(Constructing Hardware In a Scala Embedded Language)是一种嵌入在高阶编程语言 Scala 中用来构造硬件的语言。Chisel实际上只是一组特殊的用Scala 事先定义的类、对象 和使用惯例,所以写一份Chisel程序的时候,你实际上在写一份Scala程序[2]。
Rocket Chip is an open-source Sysem-on-Chip design generator that emits synthesizable RTL. It leverages the Chisel hardware construction language to compose a library of sophisticated generators for cores, caches, and interconnects into an integrated SoC[3].
由上面描述,应该可以知道,Rocket Chip是一个开源的SOC生成器,可以根据自己的配置生成不同的SOC(RTL),而Rocket Chip是基于Chisel完成的,最后Chisel是在Scala中定义的特殊类和对象,因此修改Rocket Chip的源代码就是修改Scala代码,利用Chisel编译出的文件为*.fir,要将*.fir转换为verilog RTL还需要firrtl这个工具。
Rocket Chip整个项目的Scala编译都基于sbt的,而sbt是基于java的,因此要生成Rocket-chip RTL,要先安装java,sbt,chisel3和firrtl。注意Rocket-chip RTL的生成不会用到工具链,需要编译工具链时才需要设置环境变量。
Rocket-chip verilog RTL生成步骤:
1、 克隆项目:
$ git clone https://github.com/ucb-bar/rocket-chip.git
$ cd rocket-chip
$ git submodule update --init
2、 安装java,下面是以Ubuntu为例子。
sudo apt-get install default-jdk
3、 安装sbt,安装sbt过程中可能因为网速或链接的问题会出现下载失败的现象,多试几次就好:
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
sudo apt-get update
sudo apt-get install sbt
4、 下载Rocket Chip项目的sbt依赖库,下载过程中可能因为网速或链接的问题会出现下载失败的现象,多试几次就好:
$ cd rocket-chip
$ sbt
直到弹出这样的提示就证明成功了,然后输入exit退出:
sbt:rocketchip>
5、 编译&安装chisel3:
$ cd rocket-chip/chisel3
$ sbt
直到弹出这样的提示就证明成功了,然后输入exit退出:
sbt:chisel3>
6、 编译&安装firrtl:
$ cd rocket-chip/firrtl
$ sbt
直到弹出这样的提示就证明成功了,然后输入exit退出:
sbt:firrtl>
7、 生成rocket-chip verilog RTL
$ cd rocket-chip/vsim
$ make verilog CONFIG=DefaultSmallConfig
漫长等待后,RTL生成
$cd rocket-chip/vsim/generated-src
这个目录下有很多刚生成的东西,下面再对这个目录生成的文件进行说明。
生成文件的说明:
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式文件说明
文件 | 说明 |
---|---|
freechips.rocketchip.system.DefaultSmallConfig | 这个目录存放一些通用的*.v,如AsyncResetReg.v和plusarg_reader.v;同时也存放VCS仿真用的SimJTAG.v和 Verilator仿真用的SimJTAG.cc、remote_bitbang.cc和remote_bitbang.h。 |
freechips.rocketchip.system.DefaultSmallConfig.xxx.regmap.json | 具体SOC设备的寄存器地址,视你生成的模块而定,会有很多个的,xxx代表不同的设备。 |
freechips.rocketchip.system.DefaultSmallConfig.anno.json | 这个文件貌似是每个模块的一些属性说明,我也不太确定。 |
freechips.rocketchip.system.DefaultSmallConfig.behav_srams.v | 这个是生成的rocket-chip所用到的sram,即全部memory的verilog文件。 |
freechips.rocketchip.system.DefaultSmallConfig.conf | 用到的memory的深度、长度和块的说明。 |
freechips.rocketchip.system.DefaultSmallConfig.d | 如果有安装VCS的话,在vsim的目录中可以直接跑VCS的仿真。这个文件就是所生成的rocket-chip RTL要跑的仿真case,即将要跑VCS仿真的全部case归总在这个文件中。因为我没有安装VCS,所以我只生成RTL。 |
freechips.rocketchip.system.DefaultSmallConfig.dts | 这个文件的内容在make verilog完成的时候已经出现过,是你所配置的rocket-chip的设备清单。 |
freechips.rocketchip.system.DefaultSmallConfig.fir | 通过chisel3编译出来的中间文件,需要利用firrtl将这个文件转换为真正的RTL。 |
freechips.rocketchip.system.DefaultSmallConfig.graphml | graphml一种图形描述语言,内容为xml格式,放弃解析。 |
freechips.rocketchip.system.DefaultSmallConfig.json | 这个文件有点乱,我也不知道怎么解析,我猜是生成*.dts的过度文件,大家脑补吧。 |
freechips.rocketchip.system.DefaultSmallConfig.memmap.json | 这个文件和上面的文件类似,不过是真的memory的。 |
freechips.rocketchip.system.DefaultSmallConfig.plusArgs | 这个文件貌似是用于 Verilator和VSC仿真的。 |
freechips.rocketchip.system.DefaultSmallConfig.rom.conf | 因为我生成的RTL是不包含rom的,所以这个文件是空的,我猜这个文件在生成的rocket-chip中包含rom和包含/rocket-chip/bootrom/bootrom.img时才有内容。大家可以自行尝试。 |
freechips.rocketchip.system.DefaultSmallConfig.v | 所配置的rocket-chip verilog RTL代码,全部RTL在一个文件中。 |
备注:由于我不在vsim目录中进行仿真,所以很多文件对于我来说是没有作用的,只有以下三个文件有用:freechips.rocketchip.system.DefaultSmallConfig.dts(看配置)、freechips.rocketchip.system.DefaultSmallConfig.behav_srams.v & freechips.rocketchip.system.DefaultSmallConfig.v(这两个文件是verilog RTL)。如果你要在vsim中进行仿真,那要再认真研究其他文件。
参考资料:
[1] https://baike.baidu.com/item/Scala
[2] https://chisel.eecs.berkeley.edu/documentation.html《Chisel 3.0 Tutorial (Beta)》
[3] https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-17.html《The Rocket Chip Generator》