RISC-V --rocket-chip generator介绍及其仿真使用

最近工作使用 rocket-chip generator 仿真非极大值抑制算法(C语言编写),分析其时序模型和riscv汇编指令,这里将rocket-chip generator的使用方法总结一下

说明:使用的rocket-chip generator的版本为:a8d573beeb8a33bb5dac0673ec68b82852a24d63

rocket-chip generator介绍

  • rocket-chip generator的一级目录结构:

    bootrom : 在BootROM的bootloader第一阶段所使用的代码
    csrc Verilator: 仿真用的C代码
    emulator Verilator :用来编译和跑仿真的工作目录
    project Scala: 构建工具sbt用来构建Scala的工作目录
    regression: 定义的持续的整合和一套nightly regression
    scripts: 用来分析仿真的输出或者处理代码文件的内容
    vsim VCS: 用来编译和跑仿真的工作目录
    vsrc Verilog: 代码,包含接口、测试框架和Verilog过程接口VPI
    chisel3 :包含Chisel自定义的各种类和规则,用来生成RTL
    firrtl: 存放Chisel编译器处理代码而生成的一种中间表示,由中间表示能生成Verilog代码或C++代码
    hardfloat: 用chisel写成的浮点单元
    riscv-tools: 支持RISC-V的一套软件,与生成RTL有关
    torture: 用来生成压力测试所需的一些随机指令
    src/main/scala: 构筑rocket-chip的代码

  • rocket-chip generator电路构筑代码的目录结构:

    amba amba: 协议的实现代码,包括AXI4,AHB-lite,APB
    config: 提供能配置Generator的Scala的接口
    coreplex: 包含Rocket核、系统总线、coherence agents、debug设备、中断处理、面向外部的外设、时钟同步处理和TileLink到外设总线转换
    devices: 一些外设,包括debug模块和各种挂在TileLink的从设备
    diplomacy: 用来扩展Chisel,通过允许对硬件进行两个阶段的阐述,可以让参数在模块之间协调传递
    groundtest: 生成可综合的硬件测试平台,通过发出随机的访问存储器指令流,进行对核外的存储器系统进行压力测试
    jtag: 用来生成JTAG总线接口
    regmapper: 用来生成带有能访问内存映射寄存器的标准接口的从设备
    rocket: 用来生成顺序核Rocket、L1指令cache和L1数据cache
    tile: 包含可以与Rocket核组成tile的组件,如FPU和RoCC协处理器
    tilelink: 用来生成TileLink总线(协议),包含一些适配器和转其他总线(协议)的转换器
    system Rocket Chip的顶层代码包,同时也是用作测试的硬件平台的顶层代码包
    unittest: 用作生成硬件测试平台来测试单独的一个个模块
    util: 提供一些能被其他代码包调用的通用的Scala和Chisel结构

rocket-chip generator使用

  • 在src/main/scala/coreplex/Configs.scala的类都是构筑rocket-chip的“部件”。需要在src/main/scala/system/Configs.scala中将“部件”类和“底板”类BaseConfig组合起来,每一个都是一种配置方案。具体的方法就是利用“++”这个函数,写法参考该文件的其他类写法即可。
    生成Verilog代码及测试用的入口用到的命令:

    cd emulator
    make CONFIG=DefaultConfig

  • 其中CONFIG=后面接的是在src/main/scala/system/Configs.scala写好的类名。若编译没有错误,则会生成以下文件和文件夹:
    RISC-V --rocket-chip generator介绍及其仿真使用_第1张图片

  • generated-src文件夹包括生成的Verilog文件和一些测试用的文件,verilator文件夹包含仿真工具verilator的源码和安装文件。emulator-freechips.rocketchip.system-DefaultConfig是可执行文件,是测试程序的入口。图中圈着的文件夹是测试进行的环境,.v文件就是生成的rocket-chip的Verilog代码。
    RISC-V --rocket-chip generator介绍及其仿真使用_第2张图片

rocket-chip generator仿真C或C++程序

1. 使用risc-v工具链编译仿真

  • 写好的一个测试的C或C++程序如下:
    RISC-V --rocket-chip generator介绍及其仿真使用_第3张图片

  • 使用命令编译测试程序:

    riscv64-unknown-elf-gcc helloworld.c -o helloworld

  • 然后将生成的helloworld可执行文件放到emulator工作目录,再在emulator工作目录下执行命令:

    ./emulator-freechips.rocketchip.system-DefaultConfig pk helloworld

  • 等待几分钟(具体等待时间取决于程序的大小)后,终端输出“Hello World”

2.利用rocket的方法如下(比之前的跑的更快,而且能看波形)

  • 在rocket-chip/riscv-tools/riscv-tests/benchmarks中新建测试程序的文件夹helloworld,并在其中写好一个测试程序helloworld:
    RISC-V --rocket-chip generator介绍及其仿真使用_第4张图片

  • 修改在rocket-chip/riscv-tools/riscv-tests/benchmarks中的Makefile,修改其中的bmarks变量,使其新值为新建的文件夹名字helloworld:
    RISC-V --rocket-chip generator介绍及其仿真使用_第5张图片

  • 退出到rocket-chip/riscv-tools/riscv-tests/benchmarks执行命令make,得到.riscv可执行文件:
    RISC-V --rocket-chip generator介绍及其仿真使用_第6张图片

  • 将.riscv文件移到rocket-chip/emulator文件夹中:
    RISC-V --rocket-chip generator介绍及其仿真使用_第7张图片

  • 执行命令:

    ./emulator-freechips.rocketchip.system-DefaultConfig helloworld.riscv

  • 等待少于一分钟的时间,得到输出:
    RISC-V --rocket-chip generator介绍及其仿真使用_第8张图片

  • 执行命令:

    ./emulator-freechips.rocketchip.system-DefaultConfig +max-cycles=100000000 +verbose helloworld.riscv 2> helloworld.riscv.out

  • 得到指令执行过程信息:
    RISC-V --rocket-chip generator介绍及其仿真使用_第9张图片
    RISC-V --rocket-chip generator介绍及其仿真使用_第10张图片

  • 执行命令:

    ./emulator-freechips.rocketchip.system-DefaultConfig-debug +max-cycles=100000000 --vcd=helloworld.riscv.vcd helloworld.riscv

  • 得到.vcd波形文件:
    RISC-V --rocket-chip generator介绍及其仿真使用_第11张图片

  • 双击打开即可看到波形:
    RISC-V --rocket-chip generator介绍及其仿真使用_第12张图片

你可能感兴趣的:(RISC-V,硬件原理)