当前位置: 首页 > article >正文

【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

  1. https://github.com/riscv-collab/riscv-gnu-toolchain
  2. http://blog.chinaaet.com/weiqi7777/p/5100062001
  3. https://github.com/TheThirdOne/rars/releases/tag/v1.6

http://www.kler.cn/a/585292.html

相关文章:

  • AI建模智能生成:从2D到3D,AI只需一步!
  • 结构型模式之适配器模式:让不兼容的接口兼容
  • 工业数采适配99%协议EG8200Mini 边缘计算网关
  • 【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 碰撞检测和触发器检测的特殊生命周期函数
  • 【QT】认识 QT 安装 QT 相关软件
  • YOLOv12优化之区域注意力机制(A2)和残差高效层聚合网络(R-ELAN)
  • 【第七节】windows sdk编程:Windows 中的对话框
  • 计算机安全 第四节:访问控制(中)
  • 学习threejs,使用MeshFaceMaterial面材质容器
  • pom.xml中配置的repository,在编译器下载依赖包没生效,怎么解决
  • CNN 稠密任务经典结构
  • 市场趋势分析与策略优化
  • DeepSeek 加持!IvorySQL 文档智能助手正式上线!
  • 疗养院管理系统设计与实现(代码+数据库+LW)
  • 【Rust基础】Rust后端开发常用库
  • linux 命令 case
  • CNN的激活函数
  • 印刷店常用的PDF批量页码统计软件
  • 网络测试工具:涵盖网络测速、密码查看、故障判断与网络监测
  • Linux--普通文件的管理