a33 linux工具链,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写好的类名。若编译没有错误,则会生成以下文件和文件夹:

23f1956bc7928c1906b707d4b4f0cadb.png

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

2dc3c0ceadf7bc4f87978e1ff3defef5.png

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

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

写好的一个测试的C或C++程序如下:

c254d3fa26aa86c247fb0978537f205e.png

使用命令编译测试程序:

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:

208802f3c93f7db149154d69ee7ffae9.png

修改在rocket-chip/riscv-tools/riscv-tests/benchmarks中的Makefile,修改其中的bmarks变量,使其新值为新建的文件夹名字helloworld:

3eeb9dfb56563cbc1c3f83b6de3fdc29.png

退出到rocket-chip/riscv-tools/riscv-tests/benchmarks执行命令make,得到.riscv可执行文件:

33443ae6b2b0da497e82d5bcf7b8f8f1.png

将.riscv文件移到rocket-chip/emulator文件夹中:

51b6deadf2767d8a42b655b24793e6a0.png

执行命令:

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

等待少于一分钟的时间,得到输出:

ba1e22f574bb95f8cabb7ea99aed1318.png

执行命令:

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

得到指令执行过程信息:

f1e6a2094898962f85ec32ccb4e84d67.png

e95cebcb1a7a968294cfcab0c6d6e9b1.png

执行命令:

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

得到.vcd波形文件:

7f148008ec306b1a51d513ba8ee56646.png

双击打开即可看到波形:

b4fecce3244f73eec6189b7696bf6828.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值