【RISCV LAB】0x01-安装实验仿真辅助工具
安装实验辅助工具
- 实验环境搭建
- 安装 Verilator
- 编译依赖
- 下载源码
- 编译安装
- 测试安装
- 安装 RISC-V 交叉编译工具链
- 编译依赖
- 下载源码
- 编译安装
- 编译并安装
- 添加环境变量并测试
- 安装 GTKWave
- 其他模拟器推荐
- RARS
- emulsiV
- FAQ
实验环境搭建
Verilator 是一款开源的支持 Verilog 和 SystemVerilog 仿真工具。它能够将给定的电路设计翻译成 C++ 或者 SystemC 的库等中间文件,最后使用 C/C++ 编写激励测试,去调用前面生成的中间文件,由 C/C++ 编译器编译执行,来完成仿真。此外,它也具有静态代码分析的功能。
我们需要手动编译安装 Verilator,步骤可以参考官方文档。本文主要对文档内容进行整理,并补充一些细节。
安装 Verilator
编译依赖
Verilator 的编译安装需要以下依赖:
sudo apt-get install git perl python3 make autoconf g++ flex bison ccache
sudo apt-get install libgoogle-perftools-dev numactl perl-doc help2man
sudo apt-get install libfl2 (ignore if gives error)
sudo apt-get install libfl-dev (ignore if gives error)
sudo apt-get install zlib1g zlib1g-dev (ignore if gives error)
下载源码
通过以下命令来下载源码:
git clone https://github.com/verilator/verilator
或者
git clone https://gitee.com/bigdark1024/verilator.git
编译安装
cd verilator
./configure --prefix=your-path-for-output
make -j <nproc>
还可以测试
make test
最后安装
make install
测试安装
执行以下命令:
verilator -version
Verilator 5.035 devel rev v5.034-61-gaca3b1636
安装 RISC-V 交叉编译工具链
编译依赖
sudo apt install autoconf automake autotools-dev curl python3 python3-pip
sudo apt install libmpc-dev libmpfr-dev libgmp-dev gawk
sudo apt install build-essential bison flex texinfo gperf libtool patchutils
sudo apt install bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev
下载源码
下载 RISC-V 交叉编译工具链的源码。
- 如果网络可以直接从github下载
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
- 如果网络不理想
git clone https://mirror.iscas.ac.cn/riscv-toolchains/git/riscv-collab/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain/
curl https://mirror.iscas.ac.cn/riscv-toolchains/git/riscv-collab/riscv-gnu-toolchain.sh | bash
编译安装
进入源码目录,创建 build 文件夹并进入:
cd riscv-gnu-toolchain
mkdir build
cd build
需要编译的是支持乘除法扩展的 riscv64-unknown-linux-gnu 工具链,因此需要执行以下命令进行配置:
➜ build git:(master) ✗ ../configure --prefix=/opt/riscv64 --enable-multilib --enable-languages=c,c++ --target=riscv64-linux-multilib
configure: WARNING: unrecognized options: --enable-languages
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for fgrep... /usr/bin/grep -F
checking for grep that handles long lines and -e... (cached) /usr/bin/grep
checking for bash... /bin/bash
checking for __gmpz_init in -lgmp... yes
checking for mpfr_init in -lmpfr... yes
checking for mpc_init2 in -lmpc... yes
checking for curl... /usr/bin/curl
checking for wget... /usr/bin/wget
checking for ftp... /usr/bin/ftp
configure: creating ./config.status
config.status: creating Makefile
config.status: creating scripts/wrapper/awk/awk
config.status: creating scripts/wrapper/sed/sed
configure: WARNING: unrecognized options: --enable-languages
在编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持 32 位和 64 位。
编译并安装
sudo make linux -j 6
编译完成后,就可以在 /opt/riscv64/bin 目录下找到交叉编译工具链了。
➜ riscv64 pwd
/opt/riscv64
➜ riscv64 tree -L 2
.
├── bin
│ ├── riscv64-unknown-linux-gnu-addr2line
│ ├── riscv64-unknown-linux-gnu-ar
│ ├── riscv64-unknown-linux-gnu-as
│ ├── riscv64-unknown-linux-gnu-c++
│ ├── riscv64-unknown-linux-gnu-c++filt
│ ├── riscv64-unknown-linux-gnu-cpp
│ ├── riscv64-unknown-linux-gnu-elfedit
│ ├── riscv64-unknown-linux-gnu-g++
│ ├── riscv64-unknown-linux-gnu-gcc
│ ├── riscv64-unknown-linux-gnu-gcc-14.2.0
│ ├── riscv64-unknown-linux-gnu-gcc-ar
│ ├── riscv64-unknown-linux-gnu-gcc-nm
│ ├── riscv64-unknown-linux-gnu-gcc-ranlib
│ ├── riscv64-unknown-linux-gnu-gcov
│ ├── riscv64-unknown-linux-gnu-gcov-dump
│ ├── riscv64-unknown-linux-gnu-gcov-tool
│ ├── riscv64-unknown-linux-gnu-gdb
│ ├── riscv64-unknown-linux-gnu-gdb-add-index
│ ├── riscv64-unknown-linux-gnu-gfortran
│ ├── riscv64-unknown-linux-gnu-gp-archive
│ ├── riscv64-unknown-linux-gnu-gp-collect-app
│ ├── riscv64-unknown-linux-gnu-gp-display-html
│ ├── riscv64-unknown-linux-gnu-gp-display-src
│ ├── riscv64-unknown-linux-gnu-gp-display-text
│ ├── riscv64-unknown-linux-gnu-gprof
│ ├── riscv64-unknown-linux-gnu-gprofng
│ ├── riscv64-unknown-linux-gnu-ld
│ ├── riscv64-unknown-linux-gnu-ld.bfd
│ ├── riscv64-unknown-linux-gnu-lto-dump
│ ├── riscv64-unknown-linux-gnu-nm
│ ├── riscv64-unknown-linux-gnu-objcopy
│ ├── riscv64-unknown-linux-gnu-objdump
│ ├── riscv64-unknown-linux-gnu-ranlib
│ ├── riscv64-unknown-linux-gnu-readelf
│ ├── riscv64-unknown-linux-gnu-run
│ ├── riscv64-unknown-linux-gnu-size
│ ├── riscv64-unknown-linux-gnu-strings
│ └── riscv64-unknown-linux-gnu-strip
├── etc
│ └── gprofng.rc
├── include
│ ├── collectorAPI.h
│ ├── gdb
│ ├── libcollector.h
│ ├── libfcollector.h
│ └── sim
├── lib
│ ├── bfd-plugins
│ ├── gcc
│ ├── gprofng
│ ├── libcc1.la
│ ├── libcc1.so -> libcc1.so.0.0.0
│ ├── libcc1.so.0 -> libcc1.so.0.0.0
│ ├── libcc1.so.0.0.0
│ ├── libgprofng.a
│ ├── libgprofng.la
│ └── libriscv64-unknown-linux-gnu-sim.a
├── libexec
│ └── gcc
├── riscv64-unknown-linux-gnu
│ ├── bin
│ ├── include
│ ├── lib
│ ├── lib32
│ └── lib64
├── share
│ ├── gcc-14.2.0
│ ├── gdb
│ ├── info
│ └── man
└── sysroot
├── etc
├── lib
├── lib32
├── lib64
├── sbin
├── usr
└── var
31 directories, 49 files
添加环境变量并测试
通过以下命令将交叉编译工具链添加到环境变量中:
- bash
echo 'export PATH=/opt/riscv64/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
- zsh
echo 'export PATH=/opt/riscv64/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
- 查看交叉编译工具链的版本:
➜ ~ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc () 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
若输出了编译器的版本信息,则说明已经安装成功。
➜ ~ riscv64-unknown-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/14.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: your-configured-path/riscv-gnu-toolchain/build/../gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv64 --with-sysroot=/opt/riscv64/sysroot --with-pkgversion= --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=../../gcc --disable-default-pie --enable-multilib --with-abi=lp64d --with-arch=rv64gc --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 14.2.0 ()
说明 :
--target= riscv64-linux-multilib: 指定工具为riscv64-linux-multilib
--prefix=/opt/riscv64: 指定工具生成的目录
--enable-languages=c,c++: 支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64gc: 工具链支持的riscv架构是 rv64gc
--enabl-multilib: 启动 multilib
安装 GTKWave
GTKWave 是用来查看波形的一款图形化软件,我们将使用它查看 Verilator 生成的电路波形图,完成对硬件逻辑的调试,安装命令:
sudo apt install gtkwave
- 查看波形命令
gtkwave <vcd-file-path>
其他模拟器推荐
RARS
https://github.com/TheThirdOne/rars/releases/download/v1.6/rars1_6.jar
下载之后执行
java -jar .\rars1_6.jar
emulsiV
这是一款在线模拟器,简单易上手,对指令的走向更加直观,大家可以自己探索。
链接:https://eseo-tech.github.io/emulsiV/
FAQ
- https://github.com/riscv-collab/riscv-gnu-toolchain
- http://blog.chinaaet.com/weiqi7777/p/5100062001
- https://github.com/TheThirdOne/rars/releases/tag/v1.6