Orange_Pi_AIpro运行蜂鸟RISC-V仿真
突发奇想,试一试Orange Pi AIpro
上运行蜂鸟RISC-V的仿真。
准备
默认已经有一个Orange Pi AIpro
,并且对设备进行一定的初始化配置,可以参考上一篇博文开源硬件初识——Orange Pi AIpro(8T)。
其次,默认要了解Verilog相关的EDA工具使用。
Humming Bird 相关资料
蜂鸟RISC-V开源项目:e203-hbirdv2
GitHub仓库地址,Gitee仓库地址,Quick Start-up;
最主要的步骤需要跟着Quick start
一步步进行。
环境安装
环境安装流程如下:
-
首先确认系统版本,建议的系统为
Ubuntu 18.04
,Orange Pi 上的版本为Ubuntu 22.04.3 LTS
; -
也需要安装一些工具,这条指令只有一行,复制的时候需要注意。
sudo apt-get install autoconf automake autotools-dev curl device-tree-compiler libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev git
-
当然,没有在Orange Pi 上安装
VCS + Verdi
,那么就用iverilog + GTKwave
来实现编译仿真看波形的操作了:sudo apt install iverilog gtkwave
-
克隆
e203_hbirdv2
仓库:# 从GitHub克隆 git clone https://github.com/riscv-mcu/e203_hbirdv2.git # 或者从Gitee克隆 git clone https://gitee.com/riscv-mcu/e203_hbirdv2.git
第二项的安装工具,有些系统里面已经存在了,整体内容比较多,安装之后还得一个个对,哪些是没有安装上的。
或者直接再安装一遍,如果已经安装过会提示下面的字样:
autoconf is already the newest version (2.71-2).
automake is already the newest version (1:1.16.5-1.3).
autotools-dev is already the newest version (20220109.1).
bc is already the newest version (1.07.1-3build1).
......
编译自测
这一步花了不少时间,但是快做完了,发现手册上的Note
有说明:
In <your_e203_dir>/riscv-tools/riscv-tests/isa/generated directory, there are pre-generated executable files. If the test codes have been changed, just using above commands could regenerate executable files.
也就是说,仓库里是带有编译好的文件,如果再执行一次编译,只是将文件覆盖。如果没有编译需求的话,可以先跳过这一步,直接运行Demon
进行仿真。
系统架构的原因
官方工具链里的系统架构是Ubuntu x86-64
的,而Orange Pi AIPro
的架构为aarch64
也就是ARM64
(可以通过指令uname -m
查询)。
执行文件如果直接执行,被提示如下问题:
./riscv-nuclei-elf-gcc
bash: ./riscv-nuclei-elf-gcc: cannot execute binary file: Exec format error
使用file
指令,查看当前二进制文件的架构与当前系统是否匹配:
file riscv-nuclei-elf-gcc
riscv-nuclei-elf-gcc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=8b45da0b8ea77ca13deb8d87bc6e5bdb23c04d38, stripped
从 file
命令的输出可以看到,riscv-nuclei-elf-gcc
是一个 64 位的 x86-64 架构的 ELF 可执行文件,动态链接,并使用 ld-linux-x86-64.so.2
作为解释器。这意味着该文件只能在 x86-64 架构的系统上运行。
这么看,就需要重新编译工具链了。
重新编译工具链
访问工具链的源代码,可以在当前系统上重新编译工具链,以便生成适用于当前架构的二进制文件。
Gitee 上的 RISC-V GNU 工具链文档
-
克隆仓库
git clone https://github.com/riscv/riscv-gnu-toolchain
注意,整个克隆可能需要大于6.65GB的磁盘容量,和下载流量。
-
安装依赖项
Ubuntu系统,执行以下内容:
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build
-
配置和构建
因为看到刚才在文档中下载的文件有
Newlib
的字样,所以选择这种方式进行配置:./configure --prefix=/opt/riscv make
这个过程等了很长时间,步骤1提到的大约6.55G的内容应该是在这里下载的。
-
更新
PATH
export PATH=/opt/riscv/bin:$PATH
-
验证安装
riscv64-unknown-elf-gcc --version
尝试到第3步,但是数据下载太慢了,无奈终止,使用已经编译好的数据继续进行。
编译RSIC-V程序产生烧录文件
如果不出意外的话,按照目录上需要的内容进行动态链接库的引用,注意rv_linux_bare_9.21_centos64.tgz.bz2
需要替换为下载的压缩包名称,或者是自己编译的路径:
cp rv_linux_bare_9.21_centos64.tgz.bz2 ~/
cd ~/
tar -xjvf rv_linux_bare_9.21_centos64.tgz.bz2
cd <your_e203_dir>/
mkdir -p ./riscv-tools/prebuilt_tools/prefix/bin
cd ./riscv-tools/prebuilt_tools/prefix/bin/
ln -s ~/rv_linux_bare_19-12-11-07-12/bin/* .
最后一步注意,需要创建bin
目录下面的所有文件到动态链接库,之后使用指令进行编译:
cd <your_e203_dir>/riscv-tools/riscv-tests/isa
source regen.sh
主要内容为<your_e203_dir>/riscv-tools/riscv-tests/isa/generated
的文件:
以第一组rv32mi-p-breakpoint
为例:
rv32mi-p-breakpoint
为二进制文件,编译后的程序烧录文件;rv32mi-p-breakpoint.dump
为程序对应的机器码顺序;rv32mi-p-breakpoint.verilog
为ICM
,DCM
对应的存储数据。
这些内容都是后续仿真,调试中不可或缺的文件。
运行仿真
切换到仓库主目录下,可以运行Verilog code
的编译,这里以iverilog
为例:
cd <your_e203_dir>/vsim
make clean
make install
// For iVerilog:
make compile SIM=iverilog
开始默认Testcase
的仿真:
// For iVerilog:
make run_test SIM=iverilog
在Terminal
中返回:
默认case
工作的时候,Orange Pi AI pro
只有一个CPU
工作在100%
的状态:
运行使用的时间log
如下:
real 1m57.420s
user 2m13.176s
sys 0m0.919s
显然,这个时间相对于PC级的处理器还是有些差距的。
显示波形
已经安装了GTKWave
,所以可以将仿真的结果以GUI
的画面展示出来:
// Using GTKWave:
make wave SIM=iverilog
基于图形化的桌面是可以看到GTKWave
的启动,以及仿真的波形状态:
图形界面上看波形,操作会稍微有点卡,如果引出来的信号少一点,效果略微流畅一些。
回归测试
官方手册还提供了跑回归测试的方法:
// For iVerilog:
make regress_run SIM=iverilog
make regress_collect
在这种情况下,CPU一直都是单核拉满,而且4个核看上去是随机工作的,总共用时:
real 68m43.395s
user 68m6.481s
sys 0m4.010s
哈哈,对的,花了68
分钟才跑完。
整体体验还是不错的,就是没有把gcc编译这一部实现,如果能实现就能使用Orange Pi AIpro进行RISC-V相关的开发了。