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 整体环境架构图
下面这张图,是我画的环境架构。你看一眼,心里就有数了。
你看,整个流程就是:你在主机上写代码,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