Skip to content

项目代码组织结构

WindProphet edited this page Mar 30, 2018 · 2 revisions

由于 Chisel3 项目由 scala 编写, 项目中基本符合 sbt 工程构造。

下面先介绍如何能够迅速将本实例运行起来。

代码运行准备工作

在克隆并运行本工程之前请确保处在 Linux 或者 macOSPOSIX 兼容系统中。

并且确保相关依赖程序已经被正确安装

  • 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 工程)
  • scripts 工程构造和生成相关脚本
  • src
    • main 逻辑结构代码
    • test 单元测试代码

sbt 工程依赖项

build.sbtproject/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.pyscripts/testconst.py 将通过以上解析结果生成位于 src/main/scalasrc/test/scala 中的常数定义文件 Constants.scala

运行 make constants 以强制执行常数生成脚本

测试链接脚本

在执行测试之后,会在 test_run_dir 产生很多日期排序的文件,此脚本则会把最新的测试产生数据文件夹链接到 test_run_dir/xxxTester/Latest

scripts/link_latest.sh 脚本会在测试结束后被自动运行

控制器代码文件

代码文件分为两部分,电路描述文件和单元测试代码,分别位于 src/main/scalasrc/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'