openhwgroup / cva6简要介绍和使用详细指南

2,788 阅读10分钟

Build Status

CVA6 RISC-V Cpu

CVA6是一个6级、单发、内排序的CPU,实现了64位RISC-V指令集。它完全实现了第一卷:用户级ISA V 2.3中规定的I、M、A和C扩展,以及特权扩展1.10草案。它实现了三个权限级别M、S、U,以完全支持类似Unix的操作系统。此外,它还符合外部调试规范0.13草案。

它有可配置的大小,独立的TLB,一个硬件PTW和分支预测(分支目标缓冲区和分支历史表)。主要的设计目标是减少关键路径的长度。

目录结构。

目录结构将CVA6 RISC-V CPU内核与CORE-V-APU FPGA仿真平台分开。cva6 下的文件、目录和子模块用于内核,不应依赖APU。corev_apu 下的文件、目录和子模块用于FPGA仿真平台。 CVA6内核可以独立编译,显然APU依赖于该内核。

这个Repo的顶层目录。

  • ci:CI的脚本软件。
  • common: CVA6核心和COREV APU都使用的源代码。这里的子目录是local ,用于存放在本软件库中的普通文件和存放在其他软件库中的submodules
  • 核心。仅用于CVA6核心的源代码。这个目录中不应该有用于构建CVA6核心以外的任何资源。
  • corev_apu: CVA6 APU的源代码,不包括CVA6核心。这个目录中不应该有用于构建CVA6核心的源码。
  • docs:文档。
  • scripts:一般的脚本软件。

验证

CVA6的验证环境在本仓库中。

这个核以及OpenHW集团CORE-V系列的其他核的验证环境在GitHub上的core-v-verif仓库。

core-v-verif项目支持的Makefiles会自动克隆适当版本的CVA6RTL源。

贡献

我们非常感谢社区的贡献。

为了减轻审查贡献的工作,请查看贡献

问题和故障排除

如果你在CVA6或文档中发现任何问题,请查看问题跟踪器,如果你的问题还没有被跟踪,请创建一个新的问题。

出版

如果你在你的学术工作中使用CVA6,你可以引用我们。

@article{zaruba2019cost,
   author={F. {Zaruba} and L. {Benini}},
   journal={IEEE Transactions on Very Large Scale Integration (VLSI) Systems},
   title={The Cost of Application-Class Processing: Energy and Performance Analysis of a Linux-Ready 1.7-GHz 64-Bit RISC-V Core in 22-nm FDSOI Technology},
   year={2019},
   volume={27},
   number={11},
   pages={2629-2640},
   doi={10.1109/TVLSI.2019.2926114},
   ISSN={1557-9999},
   month={Nov},
}

CVA6用户文档

gh-md-toc创建

开始使用

下面的说明将允许你在CVA6 APU测试平台(corev_apu/tb)中编译和运行CVA6 APU的Verilator模型(它实例化了CVA6内核)。

签出资源库

签出资源库并初始化所有子模块

git clone https://github.com/openhwgroup/cva6.git
git submodule update --init --recursive

安装Verilator仿真流程

  1. 设置安装目录RISCV 环境变量,即export RISCV=/YOUR/TOOLCHAIN/INSTALLATION/DIRECTORY
  2. 运行./ci/setup.sh ,安装所有需要的工具(即verilator,device-tree-compiler,riscv64-unknown-elf-*,...)。

你可以使用./ci/install-verilator.sh 从源码安装verilator,或者通过手动安装verilator >= 4.002注意:目前4.106和4.108版本存在一个已知的问题。4.106版不能编译,4.108版在几个周期的模拟时间后就挂掉了。)

建立模型和运行模拟

通过使用Makefile建立CVA6的Verilator模型。

要建立支持vcd文件的verilator模型,请运行

这将创建一个包括SystemVerilog包装器在内的C++核心模型,并将其与C++测试平台(在tb 子文件夹中)链接。该二进制文件可以在work-ver ,并接受一个RISC-V ELF二进制文件作为参数,例如。

work-ver/Variane_testharness rv64um-v-divuw

Verilator测试平台使用riscv-fesvr 。这意味着你可以使用riscv-tests 存储库和riscv-pk 开箱即用。作为一般的经验法则,Verilator模型将表现得像Spike(除了慢了几个数量级)。

Verilator模型和Questa模拟都会产生跟踪日志。Verilator的跟踪是比较基本的,但是你可以将日志输入到spike-dasm ,将指令解析为助记符。不幸的是,Verilator的跟踪文件目前还不能进行数值检查。

spike-dasm < trace_hart_00.dasm > logfile.txt

使用Verilator构建、编译和运行CVA6内核的示例测试平台(已知可在V4.108中使用)。

$ cd core/example_tb
$ make veri_run

make help 将打印所有支持的目标。

运行用户空间的应用程序

可以用(RISC-V Proxy Kernel and Boot Loader)在CVA6上运行用户空间的二进制文件。 RISC-V PK可以通过运行安装。./ci/install-riscvpk.sh

mkdir build
cd build
../configure --prefix=$RISCV --host=riscv64-unknown-elf
make
make install

然后使用Verilator模型来运行RISC-V ELF。

echo '
#include <stdio.h>

int main(int argc, char const *argv[]) {
    printf("Hello CVA6!\\n");
    return 0;
}' > hello.c
riscv64-unknown-elf-gcc hello.c -o hello.elf
make verilate
work-ver/Variane_testharness $RISCV/riscv64-unknown-elf/bin/pk hello.elf

如果你想使用QuestaSim来运行它,你可以使用以下命令。

make sim elf-bin=$RISCV/riscv64-unknown-elf/bin/pk target-options=hello.elf  batch-mode=1

请耐心等待!RTL仿真要比Spike慢得多。如果你认为你遇到了问题,你可以检查跟踪文件。

物理实现

ASIC合成

如何进行cva6综合?

make -C pd/synth cva6_synth FOUNDRY_PATH=/your/techno/basepath/ TECH_NAME=yourTechnoName TARGET_LIBRARY_FILES="yourLib1.db\ yourLib2.db" PERIOD=10 NAND2_AREA=650 TARGET=cv64a6_imafdc_sv39 ADDITIONAL_SEARCH_PATH="others/libs/paths/one\ others/libs/paths/two"

不要忘记在列表中转义空格。 报告在:pd/synth/ariane/reports下。

core-v-verif 储存库进行ASIC门模拟

export DV_SIMULATORS=veri-testharness,spike
cva6/regress/smoke-tests.sh
make -C core-v-cores/cva6/pd/synth cva6_synth FOUNDRY_PATH=/your/techno/basepath/ TECH_NAME=yourTechnoName TARGET_LIBRARY_FILES="yourLib1.db\ yourLib2.db" PERIOD=10 NAND2_AREA=650 TARGET=cv64a6_imafdc_sv39 ADDITIONAL_SEARCH_PATH="others/libs/paths/one\ others/libs/paths/two"
sed 's/module SyncSpRamBeNx64_1/module SyncSpRamBeNx64_2/' core-v-cores/cva6/pd/synth/ariane_synth.v > core-v-cores/cva6/pd/synth/ariane_synth_modified.v
cd cva6/sim
make vcs_clean
python3 cva6.py --testlist=../tests/testlist_riscv-tests-cv64a6_imafdc_sv39-p.yaml --test rv64ui-p-ld --iss_yaml cva6.yaml --target cv64a6_imafdc_sv39 --iss=spike,vcs-core-gate $DV_OPTS

COREV-APU FPGA 仿真

我们目前只提供对Genesys 2板的支持。我们在这里提供Genesys 2的预构建位流和存储器配置文件。

在Vivado 2018.2上测试。该FPGA目前包含以下外围设备。

  • DDR3存储器控制器
  • 用于连接SDC卡的SPI控制器
  • 以太网控制器
  • JTAG端口(见下面的调试部分)
  • 包含零级引导程序和设备树的Bootrom。

以太网控制器和相应的网络连接仍在进行中,目前还没有功能。预计很快就会有一些更新。

对存储器配置文件进行编程

  • 打开Vivado
  • 打开硬件管理器并打开目标板(Genesys II -xc7k325t )。
  • 工具 - 添加配置内存设备
  • 选择以下Spansion SPI闪存s25fl256xxxxxx0
  • 添加ariane_xilinx.mcs
  • 按OK。闪存将需要几分钟的时间。
  • 右击FPGA设备--从配置存储器设备启动(或按FPGA上的编程按钮)。

准备SD卡

第一阶段的引导程序默认会从SD卡启动。给自己找一张合适的SD卡(我们用的是这个)。从这里抓取一个预建的Linux映像,或者按照alene-sdk资源库的README自己生成Linux映像。按照ariane-sdk资源库中的 "从SD卡启动 "部分准备好SD卡。

将终端连接到由FTDI芯片打开的USB串口设备上,例如。

screen /dev/ttyUSB0 115200

bootlaoder和Linux设置的默认波特率是115200

在你插入SD卡并对FPGA进行编程后,你可以连接到FPGA的串口,应该看到bootloader和之后的Linux启动。默认的用户名是root ,不需要密码。

生成比特流

要为Genesys II板自己生成FPGA位流(和存储器配置),请运行。

这将产生一个位流文件和存储器配置文件(在fpga/work-fpga ),你可以通过运行上述命令来永久闪现。

调试

您可以使用OpenOCD对FPGA进行调试(和编程)。我们在下面提供两个OpenOCD的例子脚本。

要开始使用,请将标有JTAG的微型USB端口连接到您的机器上。这个端口连接到Genesys 2板上的FTDI 2232 USB-to-serial芯片,通常用于访问Kintex-7 FPGA的本地JTAG接口(例如,使用Vivado对器件进行编程)。然而,FTDI芯片还提供了第二条串行链路,它被路由到FPGA上的GPIO引脚,我们利用它来连接RISC-V调试模块的JTAG。

如果你使用的是基于Ubuntu的系统,你需要添加以下udev规则到/etc/udev/rules.d/99-ftdi.rules

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idProduct}=="6010", ATTRS{idVendor}=="0403", MODE="664", GROUP="plugdev"

一旦连接到你的系统,当你输入lsusb ,FTDI芯片应该被列出。

Bus 005 Device 019: ID 0403:6010 Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC

如果是这样的话,你就可以继续用fpga/ariane.cfg 配置文件启动openocd。

openocd -f fpga/ariane.cfg

Open On-Chip Debugger 0.10.0+dev-00195-g933cb87 (2018-09-14-19:32)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
adapter speed: 1000 kHz
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
Info : clock speed 1000 kHz
Info : TAP riscv.cpu does not have IDCODE
Info : datacount=2 progbufsize=8
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=64, misa=0x8000000000141105
Info : Listening on port 3333 for gdb connections
Ready for Remote Connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : accepting 'gdb' connection on tcp/3333

然后,你将能够通过telnet 或用gdb 进行连接。

riscv64-unknown-elf-gdb /path/to/elf

(gdb) target remote localhost:3333
(gdb) load
Loading section .text, size 0x6508 lma 0x80000000
Loading section .rodata, size 0x900 lma 0x80006508
(gdb) b putchar
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000080009126 in putchar (s=72) at lib/qprintf.c:69
69    uart_sendchar(s);
(gdb) si
0x000000008000912a  69    uart_sendchar(s);
(gdb) p/x $mepc
$1 = 0xfffffffffffdb5ee

你可以通过使用读取或写入设备内存。

(gdb) x/i 0x1000
    0x1000: lui t0,0x4
(gdb) set {int} 0x1000 = 22
(gdb) set $pc = 0x1000

对OpenPiton缓存系统的初步支持

CVA6已经初步支持了普林斯顿大学的OpenPiton分布式缓存系统。为此,已经开发了一个不同的L1缓存子系统(src/cache_subsystem/wt_cache_subsystem.sv),该系统遵循写通过协议,并支持缓存失效和原子学。

相应的集成补丁将在OpenPiton的GitHub存储库中发布。查看该仓库中的README ,看看如何在OpenPiton设置中使用CVA6。

要激活不同的缓存系统,用宏WT_DCACHE (默认设置)编译你的代码。

更多

这个核心是用QuestaSim的完整授权版本开发的。如果你碰巧有这个模拟器,那么你可以用它来运行这个核心。

要指定要运行的测试,使用(例如:你想在tmp/risc-tests/build/isa 文件夹内运行rv64ui-p-sraw

make sim elf-bin=path/to/rv64ui-p-sraw

如果你用batch-mode=1 来调用sim ,它将在没有GUI的情况下运行。QuestaSim也使用riscv-fesvr 进行通信。

CI测试套件和使用Torture的随机约束测试

我们为Travis CI和GitLab CI提供了两个CI配置文件,用于运行RISCV汇编测试、RISCV基准和随机的RISCV Torture测试。两者的区别在于,Travis CI只在Verilator上运行这些测试,而GitLab CI在QuestaSim和Verilator上运行同样的测试。

如果你想在你的机器上本地运行CI测试套件,请遵循两个脚本中的任何一个ci/travis-ci-emul.shci/travis-ci-emul.sh (取决于你是否有QuestaSim)。特别是,你必须为你的系统获取所需的软件包,ci/path-setup.sh 中的路径与你的设置相匹配,并在运行任何测试套件之前运行安装和构建脚本。

一旦一切设置和安装完毕,你就可以按以下方式运行测试套件(使用Verilator)。

make verilate
make run-asm-tests-verilator
make run-benchmarks-verilator

为了运行随机的Torture测试,你首先必须在运行模拟之前生成随机程序。

./ci/get-torture.sh
make torture-gen
make torture-rtest-verilator

这在Spike和RTL目标上运行随机化程序,并检查这两个签名是否匹配。随机指令的组合可以在./tmp/riscv-torture/config/default.config 文件中配置。

CVA6可以在Questa中转储一个跟踪日志,在启用提交日志的情况下,可以很容易地与Spike进行比较。在include/ariane_pkg.sv 集。

localparam

这在Spike和RTL目标上运行随机程序,并检查这两个签名是否匹配。随机指令组合可以在./tmp/riscv-torture/config/default.config 文件中配置。这将转储一个名为trace_hart_*_*_commit.log 的文件。

这对调试长的痕迹(例如:折磨痕迹)很有帮助。要编译具有提交日志功能的Spike,请执行。

apt-get install device-tree-compiler
mkdir build
cd build
../configure --prefix=$RISCV --with-fesvr=$RISCV --enable-commitlog
make
make install

内存预加载

在标准配置中,调试模块将负责加载内存内容。它也会处理与riscv-fesvr 。根据不同的情况,这可能不是不可用的(例如:在模拟中预装一个大的精灵或Linux启动)。你可以使用preload elf标志来指定一个将被预装的二进制文件的路径。

你将失去所有的riscv-fesvr ,比如系统调用和eoc功能。

重新生成引导码(ZSBL)

用于RTL仿真的零级引导程序(ZSBL)在bootrom/ ,而FPGA的引导代码在fpga/src/bootrom 。RTL引导代码简单地跳到DRAM的基座上,FSBL接手。对于FPGA来说,ZSBL会执行额外的内务管理。两个bootloader分别在argumen寄存器a0a1 中传递hartid和地址给设备树。

要重新生成引导码,你可以使用这些目录中现有的makefile文件。为了生成SystemVerilog文件,你需要在你的系统上安装bitstring python包。

与Dromajo联合仿真

CVA6可以与Dromajo共同模拟(目前是Verilator模型)。

make verilate DROMAJO=1
make run-dromajo-verilator BIN=/path/to/elf

协同模拟的流程如下图所示。image

  1. 将感兴趣的二进制文件加载到Dromajo。

  2. 独立运行Dromajo,让几个指令完成。

  3. 倾倒检查点。这就是参考模型的整个架构状态。Dromajo会转储主存储器和启动存储器。此外,它还生成了一个启动代码。如果你要运行该代码,它将恢复整个架构状态。这意味着你可以通过运行这段代码使任何两个或更多的核进入完全同步的架构状态。

  4. 将检查点加载到RTL存储器中,在RTL中加载Dromajo的实例。Dromajo作为一个共享库被链接到模拟器上。RTL通过一组DPI调用与Dromajo进行通信。

  5. 运行RTL仿真并进行协同仿真。