2. 开发环境搭建:Vivado/Quartus安装、RISC-V GCC工具链编译、Verilator仿真环境配置

做RISC-V处理器内核开发,第一件事就是把“家伙事儿”备齐。我见过不少新手,一上来就急着写代码,结果卡在环境配置上好几天。说白了,工具链就是你的武器库,武器不趁手,仗怎么打?

这一章,咱们就把三套核心环境捋一遍:FPGA厂商工具(Vivado/Quartus)、RISC-V GCC交叉编译链、以及Verilator仿真环境。这三样东西,你后面30章天天都要用。

2.1 FPGA厂商工具:Vivado与Quartus安装

先聊FPGA工具。你选哪家芯片,就用哪家工具。Xilinx(现在叫AMD)用Vivado,Intel(原Altera)用Quartus。我个人习惯两套都装,因为不同项目可能会换平台。

2.1.1 Vivado安装要点

Vivado这玩意儿,说实话,挺“重”的。完整安装包动辄几十个GB。我建议你装Vivado HLx Edition,选Vivado组件就够了,别勾那些Vitis、DocNav之类的——除非你后面要做嵌入式软核开发。

我的小技巧: 安装路径不要有中文,不要有空格。C盘空间不够就装D盘,但路径要短,比如 D:/Xilinx/Vivado/2024.1。我以前吃过这个亏,路径太长导致编译脚本报错,查了半天。

安装完成后,记得做两件事:

  • 添加环境变量: 把 D:/Xilinx/Vivado/2024.1/bin 加到系统PATH里,这样你才能在命令行直接敲 vivado。
  • 安装驱动: 如果你要用下载器(比如JTAG),得装Digilent Adept或者Xilinx Cable Drivers。不然板子连不上,你想想看,那得多郁闷。

2.1.2 Quartus安装要点

Quartus相对轻量一些。我推荐装Quartus Prime Lite Edition,免费版够用了。安装时选Cyclone IV/V或MAX 10器件支持,这些是教学板常用的型号。

注意: Quartus和Vivado不要装在同一台电脑的同一个用户目录下。它们的环境变量可能会冲突。我曾经被这个坑过——Vivado编译好好的,Quartus一装,两个都崩了。后来我建了两个Windows用户,各管各的。

2.2 RISC-V GCC工具链编译

RISC-V的GCC工具链,说白了就是把你写的C代码编译成RISC-V机器码。这东西有两种获取方式:直接下载预编译包,或者自己从源码编译。

我建议新手直接下载预编译包。自己编译?嗯,那得等好几个小时,而且容易出错。等你后面熟练了,再考虑自己折腾。

2.2.1 预编译工具链下载

推荐几个靠谱的源:

  • SiFive官方: 提供 riscv64-unknown-elf-gcc 预编译包,支持RV32和RV64。
  • Bootlin工具链: 一个开源项目,提供各种架构的交叉编译链,RISC-V的也有。
  • Ubuntu apt: 如果你用Linux,直接 sudo apt install gcc-riscv64-unknown-elf 就行。
核心概念: 注意区分 riscv64-unknown-elf-gcc 和 riscv64-linux-gnu-gcc。前者是裸机工具链(没有操作系统),后者是带Linux的。咱们做处理器内核验证,用裸机工具链就够了。

2.2.2 从源码编译(可选)

如果你非要自己编译,流程大概是这样的:

# 1. 下载源码
git clone https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain

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

# 3. 编译(这一步很慢,建议开多线程)
make -j$(nproc)

这里解释一下参数:

  • --with-arch=rv32imc:指定指令集。rv32表示32位,i是基础整数指令,m是乘除法,c是压缩指令。
  • --with-abi=ilp32:ABI接口。ilp32表示整数、长整型、指针都是32位。

编译完成后,你会在 /opt/riscv/bin 下看到一堆工具:riscv32-unknown-elf-gcc、riscv32-unknown-elf-objdump 等等。

验证是否成功: 写一个简单的C程序,比如 int main(){ return 0; },然后用 riscv32-unknown-elf-gcc -o test test.c 编译。如果没报错,说明工具链OK了。

2.3 Verilator仿真环境配置

Verilator是个好东西。它能把Verilog/SystemVerilog代码转换成C++,然后编译成可执行文件来仿真。速度比商业仿真器(比如VCS、Modelsim)快得多。咱们做RISC-V内核开发,动辄跑几百万条指令,用Verilator最合适。

2.3.1 安装Verilator

我推荐在Linux环境下用Verilator。Windows也能用,但坑比较多。如果你只有Windows,建议装个WSL2(Windows Subsystem for Linux)。

安装步骤:

# Ubuntu/Debian
sudo apt install verilator

# 或者从源码编译(获取最新版本)
git clone https://github.com/verilator/verilator
cd verilator
autoconf
./configure
make -j$(nproc)
sudo make install
版本注意: Verilator版本迭代很快。我建议用v4.210以上的版本,对SystemVerilog的支持更好。老版本连 always_ff 都不认识,你想想看,那得多难受。

2.3.2 验证安装

装完后,跑一下这个命令:

verilator --version

如果输出版本号,说明装好了。然后咱们写个简单的测试:

// counter.v
module counter(
    input clk,
    input rst_n,
    output reg [7:0] count
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            count <= 8'd0;
        else
            count <= count + 1;
    end
endmodule

用Verilator编译:

verilator --cc counter.v --exe --build sim_main.cpp

这里 --cc 表示生成C++代码,--exe 表示生成可执行文件,--build 表示自动编译。你需要自己写一个 sim_main.cpp 作为仿真主程序。

2.3.3 仿真主程序模板

我一般用这个模板:

#include <verilated.h>
#include "Vcounter.h"

int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);
    Vcounter* top = new Vcounter;

    // 初始化
    top->clk = 0;
    top->rst_n = 0;

    // 复位
    top->rst_n = 0;
    top->eval();
    top->rst_n = 1;

    // 仿真100个时钟周期
    for (int i = 0; i < 100; i++) {
        top->clk = !top->clk;
        top->eval();
    }

    delete top;
    return 0;
}

编译运行:

./obj_dir/Vcounter

如果没报错,恭喜你,Verilator环境搭好了。

2.4 环境配置总览

我把这三套环境的核心信息整理成了一张表,方便你对照:

工具 用途 推荐版本 安装方式 验证命令
Vivado FPGA综合、实现、调试 2023.2 / 2024.1 官网下载安装包 vivado -version
Quartus FPGA综合、实现、调试 Prime Lite 23.1 官网下载安装包 quartus --version
RISC-V GCC C代码交叉编译 2024.04 (或最新) 预编译包 / 源码编译 riscv32-unknown-elf-gcc --version
Verilator Verilog/SystemVerilog仿真 v4.210+ apt / 源码编译 verilator --version

2.5 整体环境关系图

下面这张图,展示了咱们这套开发环境里,各个工具是怎么配合的:

RISC-V处理器内核开发环境架构图 RISC-V处理器内核开发环境架构 RISC-V GCC工具链 C代码 → RISC-V机器码 Verilator仿真环境 RTL代码 → C++仿真模型 Vivado / Quartus 综合 → 实现 → 下载 机器码 验证通过 FPGA开发板 开发流程说明 1. 用RISC-V GCC编译测试程序,生成机器码(.hex或.bin) 2. 用Verilator加载RTL代码和机器码,进行指令级仿真验证 3. 仿真通过后,用Vivado/Quartus综合、实现,生成比特流 4. 将比特流下载到FPGA开发板,上板调试 5. 如果上板有问题,回到Verilator仿真环境定位bug

这张图把整个开发流程串起来了。你想想看,从写C代码到最终在FPGA上跑起来,中间经过了编译、仿真、综合、实现、下载五个环节。每个环节都有对应的工具。咱们后面每一章,都会在这张图上找到自己的位置。

我的建议: 别急着把所有工具都装到最新版。先装一套稳定的组合,比如Vivado 2023.2 + Verilator 4.210 + GCC 2023.04。等跑通了第一个例程,再考虑升级。我以前就是追新,结果新版本不兼容,折腾了两天。