2. 开发环境搭建:Vivado/Quartus安装与配置、RISC-V工具链编译与安装、Verilator仿真环境搭建、Makefile与项目管理
说实话,每次带新人做RISC-V项目,最头疼的不是写代码,而是搭环境。我见过太多人卡在工具链编译这一步,一卡就是一整天。今天咱们就把这事彻底捋清楚。
核心思路:开发环境 = 硬件综合工具 + 软件编译链 + 仿真验证 + 项目管理。缺一个,你的SoC就跑不起来。
2.1 Vivado与Quartus:选哪个?怎么装?
我个人习惯用Vivado做Xilinx平台的开发,Quartus则留给Intel FPGA。但说实话,两者安装流程大同小异。
Vivado安装要点
- 版本选择:别追新。我建议用2020.2到2022.1之间的版本,稳定。2023版我踩过坑,某些IP核的license会报错。
- 安装组件:至少勾选"Vivado HL Design Edition"和"Vitis"(如果你要跑软核)。千万别省空间只装最小化,否则后面缺库你会哭。
- 环境变量:装完后记得把
Vivado/bin加到PATH里。我曾经忘了这步,折腾了半小时才发现是路径没配。
小技巧:Windows用户建议用WSL2来跑Vivado的Tcl脚本,比原生CMD快不少。Linux用户注意,Ubuntu 20.04以上版本需要手动装libtinfo5,否则启动报错。
Quartus安装避坑
- Quartus Prime Lite版免费,但只支持部分器件。做RISC-V SoC的话,Cyclone V系列够用。
- 安装路径不要有中文和空格。我见过有人装在"Program Files (x86)"下,结果ModelSim死活跑不起来。
- 记得装Device Support,默认只装当前选中的系列。你想想看,如果后面想换片子,还得重装。
2.2 RISC-V工具链:GCC还是LLVM?
嗯,这里要重点说。工具链是RISC-V生态的基石,选错了后面全是坑。
GCC工具链编译
我推荐用官方的riscv-gnu-toolchain仓库。为什么自己编译?因为预编译包经常缺multilib支持,你没法同时编译RV32和RV64的程序。
# 克隆仓库(注意加--recursive,否则子模块拉不全)
git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain
# 配置编译选项
./configure --prefix=/opt/riscv --enable-multilib
# 编译(-j参数根据你的CPU核心数调整)
make -j$(nproc)
警告:编译时间大约1-2小时,取决于你的机器。我曾经在4核笔记本上编译,去喝了杯咖啡回来才到50%。建议用服务器或者晚上挂着编译。
LLVM工具链
如果你追求编译速度,或者要做高级优化,LLVM是更好的选择。但注意,LLVM对RISC-V的支持还在完善中,某些扩展指令集可能不支持。
# 用apt安装(Ubuntu 22.04+)
sudo apt install llvm clang lld
# 验证安装
clang --target=riscv64-unknown-elf --print-supported-cpus
我个人习惯:做嵌入式裸机开发用GCC,做Linux用户态程序用LLVM。为什么?GCC的链接脚本支持更成熟,LLVM的优化更激进。
2.3 Verilator仿真环境搭建
Verilator是我最爱的仿真工具,没有之一。它把Verilog转成C++,然后编译成可执行文件,跑起来比ModelSim快一个数量级。
安装步骤
# 安装依赖
sudo apt install git perl python3 make autoconf g++ flex bison ccache
sudo apt install libgoogle-perftools-dev numactl perl-doc
sudo apt install libfl2 # Ubuntu 22.04需要
# 从源码安装(推荐)
git clone https://github.com/verilator/verilator
cd verilator
autoconf
./configure --prefix=/opt/verilator
make -j$(nproc)
sudo make install
# 验证
verilator --version
避坑指南:我曾经在Ubuntu 18.04上装Verilator 4.2,结果SystemVerilog的interface支持有问题。建议用5.0以上版本,对RISC-V的复杂总线协议支持更好。
快速测试
// 写一个简单的RISC-V加法模块
module adder (
input [31:0] a, b,
output [31:0] sum
);
assign sum = a + b;
endmodule
// 用Verilator仿真
verilator --cc adder.v --exe sim_main.cpp
make -j -C obj_dir -f Vadder.mk Vadder
./obj_dir/Vadder
你看,就这么简单。Verilator生成的仿真速度,跑一个完整的RISC-V CoreMark测试,比Vivado仿真快10倍以上。
2.4 Makefile与项目管理
项目一复杂,没有好的构建系统就是灾难。我见过有人用shell脚本管理上百个源文件,改一个路径全崩了。
一个实用的Makefile模板
# RISC-V SoC项目Makefile
TOOLCHAIN_PREFIX = riscv64-unknown-elf-
CC = $(TOOLCHAIN_PREFIX)gcc
OBJCOPY = $(TOOLCHAIN_PREFIX)objcopy
# 源文件
C_SRCS = $(wildcard sw/*.c)
ASM_SRCS = $(wildcard sw/*.S)
OBJS = $(C_SRCS:.c=.o) $(ASM_SRCS:.S=.o)
# 目标
TARGET = firmware.elf
BIN = firmware.bin
all: $(BIN)
$(TARGET): $(OBJS) linker.ld
$(CC) -T linker.ld -o $@ $^ -nostdlib -nostartfiles
$(BIN): $(TARGET)
$(OBJCOPY) -O binary $< $@
# 仿真目标
sim: $(BIN)
verilator --cc rtl/*.v --exe sim/sim_main.cpp
make -j -C obj_dir -f Vtop.mk Vtop
./obj_dir/Vtop
clean:
rm -rf obj_dir *.elf *.bin sw/*.o
.PHONY: all sim clean
关键点:
- 用
wildcard自动收集源文件,别手动一个个加 - 链接脚本
linker.ld单独管理,方便调整内存布局 - 仿真和编译分离,改软件不用重新综合硬件
项目管理建议
- 目录结构:
rtl/- 硬件源码sw/- 软件源码sim/- 仿真测试文件scripts/- Tcl脚本、Python辅助工具doc/- 文档和笔记
- 版本控制:用Git,.gitignore里记得忽略
obj_dir/、*.log、vivado*等生成文件 - 环境隔离:用
setup.sh脚本统一设置环境变量,别让每个人手动配
注意:Makefile里的缩进必须用Tab,不能用空格。这个坑我踩了不下五次,每次都是复制粘贴时格式被自动转换。
2.5 环境验证:跑通第一个Hello World
环境搭好了,怎么验证?我建议跑一个最简单的RISC-V程序,从编译到仿真全链路走通。
// hello.c
#include <stdint.h>
volatile uint32_t *uart = (uint32_t *)0x10000000;
void putchar(char c) {
*uart = c;
}
void main() {
const char *msg = "Hello RISC-V!\n";
while (*msg) {
putchar(*msg++);
}
while(1); // 死循环
}
编译命令:
riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostdlib -nostartfiles \
-T linker.ld -o hello.elf hello.c
然后用Verilator仿真,看UART输出。如果看到"Hello RISC-V!",恭喜你,环境搭好了。
个人经验:第一次跑通这个程序时,我盯着终端看了十秒钟。那种从零到一的感觉,比后面调通任何复杂模块都爽。
2.6 本章小结
开发环境搭建,说白了就是三件事:工具链能编译、仿真器能跑、项目能管理。别追求一步到位,先跑通最小系统,再慢慢加功能。
我见过太多人花一周时间搭环境,结果发现版本不兼容,又重来。我的建议是:先装Verilator和GCC工具链,跑通Hello World,再装Vivado/Quartus。这样即使后面出问题,你至少有个能用的仿真环境。