-
Notifications
You must be signed in to change notification settings - Fork 2
项目代码组织结构
由于
Chisel3
项目由 scala
编写,
项目中基本符合 sbt
工程构造。
下面先介绍如何能够迅速将本实例运行起来。
在克隆并运行本工程之前请确保处在 Linux
或者 macOS
等 POSIX
兼容系统中。
并且确保相关依赖程序已经被正确安装
- java8 (必须为java 1.9.0以下版本 java9会导致sbt错误安装)
- sbt (Scala: The interactive Build Tool)
- python3 (在指令集参数自动生成中会被使用)
- verilator (最好是 3.922 版本)
并且在此 git
项目中,有依赖其他子模块,如果 opcodes
文件夹中没有文件,需要对子模块进行克隆
cd riscv-self
git submodule update --init
安装依赖的详细方法与常见问题请点击这里
- build.sbt sbt 构建依赖文件
- Makefile 程序构建脚本文件
- opcodes risc-v 代码定义
- project (sbt 工程)
-
plugin.sbt
Chisel3
工程构造插件
-
plugin.sbt
- scripts 工程构造和生成相关脚本
-
src
- main 逻辑结构代码
- test 单元测试代码
build.sbt
与 project/plugin.sbt
两个文件中定义了工程运行时所需要的 Scala
包和引用项
关于 Chisel3
项目依赖的配置,主要是依照 sbt-chisel-dep
工程所介绍进行的配置
由于 RISC-V
指令集有许多指令在 opcodes 工程中被严谨定义,故程序中在解析指令集中固定指令和特殊模式代码时,
采用了脚本自动解析与生成的方式,方便对指令进行整理和批量修改。
opcodes 是一个外部 git
模块,在此工程中被作为子模块加入,故在构建程序之前需要先进行子模块的克隆
运行程序构建脚本时,请确保当前目录处在项目根目录处,或使用
Makefile
代为运行
scripts/opcodes.py
文件中,将项目 opcodes 中的指令定义字符串解析为定义格式,并供重新组装
beq bimm12hi rs1 rs2 bimm12lo 14..12=0 6..2=0x18 1..0=3
jalr rd rs1 imm12 14..12=0 6..2=0x19 1..0=3
xori rd rs1 imm12 14..12=4 6..2=0x04 1..0=3
srli rd rs1 31..26=0 shamt 14..12=5 6..2=0x04 1..0=3
经过脚本转换为
[
{ 'args': [ ('bimm12hi', (31, 25), None),
('rs1', (19, 15), None),
('rs2', (24, 20), None),
('bimm12lo', (11, 7), None),
('const', (14, 12), 0),
('const', (6, 2), 24),
('const', (1, 0), 3)],
'const': 99,
'len': 32,
'mask': 28799,
'name': 'beq',
'type': 'B'},
...
{ 'args': [ ('rd', (11, 7), None),
('rs1', (19, 15), None),
('imm12', (31, 20), None),
('const', (14, 12), 7),
('const', (6, 2), 28),
('const', (1, 0), 3)],
'const': 28787,
'len': 32,
'mask': 28799,
'name': 'csrrci',
'type': 'I'}]
scripts/constants.py
与
scripts/testconst.py
将通过以上解析结果生成位于 src/main/scala
与 src/test/scala
中的常数定义文件 Constants.scala
运行
make constants
以强制执行常数生成脚本
在执行测试之后,会在 test_run_dir
产生很多日期排序的文件,此脚本则会把最新的测试产生数据文件夹链接到 test_run_dir/xxxTester/Latest
上
scripts/link_latest.sh
脚本会在测试结束后被自动运行
代码文件分为两部分,电路描述文件和单元测试代码,分别位于 src/main/scala
与 src/test/scala
文件夹中
sbt
工程在执行sbt
内部构建指令时,必须位于这样的文件夹中,才能够正确的执行运行操作和单元测试操作
sbt 'run'
指令将找到src/main/scala
中唯一一个主函数模块并运行
sbt "runMain $ModuleName"
则可以选定一个需要执行的主函数模块sbt 'run generated-src' sbt 'runMain rself.Compile generated-src'
sbt 'test'
指令将执行所有处于src/test/scala
中的org.scalatest.FlatSpec
及其子类的单元测试sbt 'test' sbt 'testOnly rself.ALUTests'