Chisel3 & Scala & Rocket-chip verilog的生成

Chisel3 & Scala & Rocket-chip verilog的生成

首先弄清楚这三者的关系。
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》

你可能感兴趣的:(RISC-V,&,rocket-chip)