4. 开发环境搭建:Vivado/Quartus安装配置、RISC-V GCC工具链编译、OpenOCD调试环境搭建

说实话,做RISC-V系统移植,最磨人的不是写代码,而是搭环境。

我见过太多人,代码写得挺溜,结果卡在工具链上,一卡就是两三天。所以这一章,咱们把话说透,把坑填平。

核心思路:开发环境 = FPGA综合工具 + RISC-V交叉编译器 + 调试桥接软件。三者缺一不可,版本匹配尤其关键。

4.1 Vivado / Quartus 安装配置

先选哪个?看你手头有什么板子。

我个人习惯:Xilinx的用Vivado,Intel的用Quartus。别混着用,会出怪问题。

4.1.1 Vivado 安装要点

  • 版本选择:我建议用2019.1到2022.2之间的版本。太新的版本对RISC-V IP支持不一定好,太老的又缺驱动。
  • 安装组件:记得勾选“Vivado HL Design Edition”和“SDK”。SDK里带GCC,虽然我们后面会用独立的RISC-V GCC,但调试时偶尔会用到SDK里的工具。
  • 许可证:WebPACK版够用,除非你要用Vivado ML Enterprise。我当年就吃过亏,装了企业版结果没license,折腾半天。

小技巧:安装路径不要有中文,不要有空格。C盘空间不够就装D盘,但路径要短,比如 D:/Xilinx/Vivado/2022.1。

4.1.2 Quartus 安装要点

  • 版本推荐:Quartus Prime 20.1 或 21.1,对RISC-V软核支持比较友好。
  • 设备支持:安装时选对FPGA系列,比如Cyclone V、Arria 10。别全选,硬盘会哭的。
  • ModelSim:Quartus自带仿真器,但如果你用ModelSim,记得版本匹配。我遇到过Quartus 20.1配ModelSim 10.5c,死活连不上,后来换了10.6d才搞定。

注意:Quartus安装时,杀毒软件最好关掉。它会在注册表写一堆东西,杀毒软件一拦,安装就卡死。我吃过这个亏,重装了三次才找到原因。

4.2 RISC-V GCC 工具链编译

说白了,RISC-V GCC就是给RISC-V处理器编译代码用的。你写C代码,它帮你变成机器码。

这里有两种方式:

4.2.1 预编译工具链(推荐新手)

去SiFive官网下载预编译好的工具链。省事,但版本固定。

# 解压到 /opt 目录
sudo tar -xvf riscv64-unknown-elf-gcc-*.tar.gz -C /opt

# 添加环境变量
export PATH=$PATH:/opt/riscv64-unknown-elf/bin

4.2.2 源码编译(推荐进阶玩家)

为什么要自己编译?因为你可以定制。比如我要支持RV32IMC,预编译的可能是RV64GC,用起来浪费资源。

# 克隆仓库
git clone https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain

# 配置(以RV32IMC为例)
./configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=ilp32

# 编译(-j4 用4核,别把CPU跑满)
make -j4

关键点:编译时间很长,我当年用笔记本编译,跑了快两个小时。建议用服务器,或者晚上睡觉前跑。

4.2.3 验证工具链

riscv64-unknown-elf-gcc --version
# 输出类似:
# riscv64-unknown-elf-gcc (GCC) 12.2.0

嗯,看到版本号就说明装好了。

4.3 OpenOCD 调试环境搭建

OpenOCD是什么?它是你的调试桥梁。一端连JTAG调试器,一端连GDB。说白了,就是让GDB能通过JTAG跟FPGA里的RISC-V核说话。

4.3.1 安装OpenOCD

我建议从源码编译,因为发行版自带的OpenOCD版本太老,对RISC-V支持不好。

# 安装依赖
sudo apt-get install libtool autoconf automake texinfo libusb-1.0-0-dev

# 克隆RISC-V版本的OpenOCD
git clone https://github.com/riscv-collab/riscv-openocd
cd riscv-openocd

# 配置
./configure --prefix=/opt/openocd --enable-ftdi --enable-jtag

# 编译安装
make -j4
sudo make install

避坑指南:我曾经用Ubuntu 20.04自带的OpenOCD,结果连不上RISC-V核。查了两天,发现是版本太老,不支持RISC-V的调试寄存器。换成riscv-openocd后,一次搞定。

4.3.2 配置JTAG调试器

常用的调试器有FT2232、J-Link、CMSIS-DAP。我推荐FT2232,便宜又好用。

# 创建配置文件 openocd.cfg
# 以FT2232为例
source [find interface/ftdi/ft2232.cfg]
source [find target/riscv.cfg]

# 设置RISC-V核心参数
riscv set_ir 5
init
targets

4.3.3 启动调试会话

# 启动OpenOCD
openocd -f openocd.cfg

# 另开终端,启动GDB
riscv64-unknown-elf-gdb
(gdb) target remote localhost:3333
(gdb) load your_program.elf
(gdb) continue

注意:OpenOCD启动后,会监听3333端口。如果端口被占用,检查是不是有其他调试器在跑。我遇到过两次,都是忘了关之前的OpenOCD进程。

4.4 整体环境架构图

下面这张图,是我画的环境架构。你看一眼,心里就有数了。

RISC-V FPGA开发环境架构 主机(PC/Linux) RISC-V GCC 交叉编译器 OpenOCD 调试桥接 Vivado/Quartus FPGA综合工具 USB/JTAG JTAG调试器(FT2232/J-Link) 硬件调试接口 JTAG信号 FPGA芯片(RISC-V软核) 目标硬件平台

你看,整个流程就是:你在主机上写代码,GCC编译成机器码,OpenOCD通过JTAG调试器把程序烧进FPGA里的RISC-V核,然后调试。

4.5 环境验证清单

装完环境,别急着写代码。先跑一遍验证清单,确保每个环节都通。

序号 验证项 验证方法 预期结果
1 Vivado/Quartus安装 启动软件,新建工程 软件正常启动,无报错
2 RISC-V GCC 编译一个hello.c 生成.elf文件,无报错
3 OpenOCD 启动并连接调试器 显示target信息
4 GDB连接 target remote localhost:3333 连接成功,显示寄存器

我的经验:如果第4步连不上,八成是OpenOCD的配置文件写错了。检查一下JTAG调试器的型号和FPGA的RISC-V核配置。我曾经因为少写了一句 riscv set_ir 5,折腾了一下午。

好了,环境搭好了,下一章咱们就开始写第一个RISC-V程序,烧进FPGA里跑起来。


公众号:蓝海资料掘金营,微信deep3321