Ariane RISC-V CPU--能够引导Linux的开源CPU

2020-07-08 17:35:51

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

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

@文章{8777130,作者={F.{扎鲁巴}和L.{贝尼尼},期刊={IEEE超大规模集成系统学报},标题={应用级处理的成本:采用22 nm FDSOI技术的Linux1.7GHz64位RISC-V内核的能量和性能分析},年份={8777130},卷={27},数量={11},页数={2629-2640},doi={10.1109/T。

去拿RISC-V工具。确保您的RISCV环境变量指向您的RISC-V安装(有关详细信息,请参阅RISC-V工具和相关项目)。

这将创建包括SystemVerilog包装器的核心的C++模型,并将其链接到C++testbench(在TB子文件夹中)。二进制文件可以在工作器中找到,并接受RISC-V ELF二进制文件作为参数,例如:

Verilator测试平台使用riscv-fesvr。这意味着您可以使用riscv-test存储库以及开箱即用的riscv-pk。根据一般经验,Verilator模型的行为将类似于Spike(例外情况是速度慢了几个数量级)。

Verilator模型和Questa模拟都将生成跟踪日志。Verilator跟踪更基本,但您可以将日志提供给Spike-dasm以将指令解析为助记符。遗憾的是,目前无法对Verilator跟踪文件进行值检查。

$ECHO';#include<;stdio.h>;int main(int argc,char const*argv[]){printf(";Hello Ariane!\\n&34;);return 0;}';>;hello.c$riscv64-UNKNOWN-ELF-GCC hello.c-o hello.elf

如果要使用QuestaSim运行它,可以使用以下命令:

耐心点!RTL模拟比斯派克慢得多。如果您认为遇到了问题,可以检查跟踪文件。

我们目前仅为Genesys 2主板提供支持。我们在这里提供了Genesys 2的预建码流和内存配置文件。

以太网控制器和相应的网络连接仍在运行中,目前不起作用。预计很快会有一些更新。

右键单击FPGA设备-从配置存储设备启动(或按FPGA上的程序按钮)。

默认情况下,第一阶段引导程序将从SD卡引导。给自己买一张合适的SD卡(我们用这张)。从这里获取一个预先构建的Linux映像,或者按照Ariane-SDK存储库中的自述文件自己生成Linux映像。按照Ariane-SDK存储库中的从SD卡引导一节准备SD卡。

在您插入SD卡并对FPGA进行编程之后,您可以连接到FPGA的串行端口,应该会看到引导加载程序,然后就可以启动Linux了。默认用户名为root,不需要密码。

要自己为Genesys II板运行生成FPGA位流(和内存配置),请执行以下操作:

这将生成一个位流文件和内存配置文件(在fpga/work-fpga中),您可以通过运行上述命令永久刷新它们。

您可以使用OpenOCD调试(和编程)FPGA。下面我们提供了两个OpenOCD示例脚本。

要开始,请将标有JTAG的微型USB端口连接到您的计算机。此端口连接到Genesys 2板上的FTDI 2232 USB转串行芯片,通常用于访问KINTEX-7 FPGA的本地JTAG接口(例如,使用Vivado对设备进行编程)。然而,FTDI芯片还暴露了第二条串行链路,该链路被路由到FPGA上的GPIO引脚,我们利用这一点从RISC-V调试模块连接JTAG。

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

连接到系统后,键入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开放片上调试器0.10.0+dev-00195-g933cb87(2018年9月14日19:32)获得GNU GPL v2许可。有关错误报告,请阅读http://openocd.org/doc/doxygen/bugs.htmladapter速度:1000kHzInfo:自动选择第一个可用的会话传输";JTAG";。要覆盖使用TRANSPORT SELECT<;TRANSPORT&gT;';.info:时钟速度1000 kHzInfo:TAP riscv.cpu没有IDCODEInfo:datacount=2程序bufsize=8Info:已检查RISC-V核心;找到1个hartsInfo:HART 0:XLEN=64,MISA=0x8000000000141105Info:侦听端口3333上的GDB连接准备

$riscv64-未知-elf-gdb/path/to/elf(Gdb)目标远程本地主机:3333(Gdb)loadLoad段.text,大小0x6508 LMA 0x80000000加载段.rodata,大小0x900 LMA 0x80006508(Gdb)b putchar(Gdb)cContinuing.Program接收信号SIGTRAP,跟踪/断点陷阱。0x00000080009126 in putcha.0x00000080009126 in putcha.0x00000080009126 in putchar。

(Gdb)x/i 0x1000 0x1000:lui t0,0x4(Gdb)set{int}0x1000=22(Gdb)set$PC=0x1000。

Ariane初步支持普林斯顿大学的OpenPiton分布式缓存系统。为此,已经开发了不同的L1高速缓存子系统(src/cache_subsystem/wt_cache_subsystem.sv),其遵循直写协议并且支持高速缓存无效和原子。

OpenPiton GitHub存储库将发布相应的集成补丁。检查该存储库中的自述文件,了解如何在OpenPiton设置中使用Ariane。

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

核心是使用QuestaSim的完整许可版本开发的。如果您自己恰好有这个模拟器,这里是如何使用它来运行内核的。

要指定要运行的测试,请使用以下命令(例如:您希望在tmp/risc-tests/build/isa文件夹内运行rv64ui-p-Sraw:

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

我们为运行RISCV装配测试的Travis CI和GitLab CI提供了两个CI配置文件,即RISCV基准测试和随机RISCV拷问测试。两者的区别在于Travis CI仅在Verilator上运行这些测试,而GitLab CI在QuestaSim和Verilator上运行相同的测试。

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

完成所有设置和安装后,您可以按如下方式运行测试套件(使用Verilator):

为了运行随机化酷刑测试,您首先必须在运行模拟之前生成随机化程序:

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

Ariane可以在Questa中转储跟踪日志,这很容易与启用提交日志的Spike区别开来。在include/ariane_pkg.sv集中:

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

这对于调试长痕迹(例如:酷刑痕迹)很有帮助。要使用提交日志功能编译SPEKE,请执行以下操作:

$apt-get安装设备树编译器$mkdir build$cd build$../configure--prefix=$RISCV--with-fesvr=$RISCV--enable-Commitlog$make$[sudo]make install。

在标准配置中,调试模块将负责加载内存内容。它还将处理与riscv-fesvr的通信。根据场景的不同,这可能不会被禁用(例如:在模拟中预加载大型ELF或Linux引导)。您可以使用PRELOAD ELF标志来指定将被预加载的二进制文件的路径。

用于RTL模拟的零级引导加载器(ZSBL)位于boot trom/中,而FPGA的引导代码位于fpga/src/boot trom中。RTL引导代码只是跳转到DRAM的基址,在那里FSBL接管。对于FPGA,ZSBL执行额外的内务处理。两个引导加载器分别将hartid和地址传递给参数寄存器a0和a1中的设备树。

要重新生成引导代码,您可以使用这些目录中的现有Makefile。要生成SystemVerilog文件,您需要在系统上安装位串python包。

转储检查点。这是参考模型的整个建筑状态。DroMajo丢弃了主内存和引导内存。此外,它还生成引导代码。如果您要运行该代码,它将恢复整个体系结构状态。这意味着您可以通过运行这段代码使任意两个或更多核心进入完全同步的体系结构状态。

将检查点加载到RTL内存和RTL中的DroMajo实例。DroMajo作为共享库链接到模拟器。RTL通过一组DPI调用与DroMajo通信。