搭建开发环境:安装 Verilator、GTKWave 和 RISC-V GCC 工具链

好,咱们正式开始动手了。这一章的任务很明确——把吃饭的家当先备齐。你想想看,做芯片设计,没有趁手的工具,就像厨师没有刀,再好的菜也做不出来。

我个人习惯把开发环境分成三块:仿真工具、波形查看器、以及编译器。这三兄弟各司其职,缺一不可。咱们一个一个来搞定。

Verilator:你的数字电路仿真引擎

Verilator 是什么?说白了,它能把你的 Verilog 代码转成 C++ 或 SystemC,然后编译成可执行文件来仿真。速度比传统的仿真器快很多,我项目中跑上百万时钟周期的测试,基本都靠它。

安装其实很简单。在 Ubuntu 或 Debian 系统上,一行命令搞定:

sudo apt-get install verilator

如果你用的是其他 Linux 发行版,或者想装最新版本,建议从源码编译。我记得有一次项目需要某个新特性,apt 源里的版本太老,折腾了半天最后还是源码编译省心。

# 从源码编译 Verilator
git clone https://github.com/verilator/verilator.git
cd verilator
autoconf
./configure
make -j$(nproc)
sudo make install
小提示:编译时加上 -j$(nproc) 参数,能充分利用多核 CPU,速度翻倍。我第一次编译时忘了加,等了快十分钟才反应过来。

装完后验证一下:

verilator --version

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

GTKWave:让波形说话

仿真跑完了,怎么看结果?GTKWave 就是干这个的。它能打开 VCD 或 FST 格式的波形文件,让你直观地看到每个信号的变化。

安装同样简单:

sudo apt-get install gtkwave

嗯,这里要注意一点:GTKWave 的界面虽然看起来有点复古,但功能绝对够用。我刚开始用的时候也觉得它丑,后来发现它打开大波形文件的速度比很多商业工具还快,就再也没嫌弃过它。

RISC-V GCC 工具链:给 CPU 喂指令

咱们的软核 CPU 跑起来,总得有点程序让它执行吧?RISC-V GCC 工具链就是用来编译 C 代码,生成 RISC-V 机器码的。

这里我建议直接下载预编译的工具链,省时省力。你可以从 RISC-V GNU Toolchain 的 Release 页面 下载对应系统的版本。

下载后解压,然后把 bin 目录加到 PATH 里:

export PATH=$PATH:/path/to/riscv64-unknown-elf-gcc/bin

验证安装:

riscv64-unknown-elf-gcc --version
避坑指南:我曾经遇到过一个问题——工具链装好了,但编译出来的程序在仿真里跑不起来。查了半天,发现是没指定正确的架构参数。记住,咱们的软核 CPU 是 RV32I 架构,编译时要加 -march=rv32i -mabi=ilp32

编写第一个仿真测试

工具都装好了,咱们来写个最简单的测试,验证整个环境是否打通。

先写一个 RISC-V 汇编程序,让 CPU 执行加法:

# test.S
.globl _start
_start:
    li x1, 5      # 把 5 加载到寄存器 x1
    li x2, 3      # 把 3 加载到寄存器 x2
    add x3, x1, x2 # x3 = x1 + x2
    nop
    nop
    nop

编译成机器码:

riscv64-unknown-elf-gcc -march=rv32i -mabi=ilp32 -nostdlib -o test.elf test.S
riscv64-unknown-elf-objcopy -O binary test.elf test.bin

然后写一个简单的 Verilog 测试模块,加载这个二进制文件:

// testbench.v
module testbench;
    reg clk;
    reg rst_n;
    wire [31:0] pc;
    wire [31:0] instr;

    // 实例化你的 CPU 核心(这里先占位)
    // cpu core(...);

    initial begin
        clk = 0;
        rst_n = 0;
        #10 rst_n = 1;
        #100 $finish;
    end

    always #5 clk = ~clk;

    initial begin
        $dumpfile("wave.vcd");
        $dumpvars(0, testbench);
    end
endmodule

用 Verilator 仿真:

verilator --cc --exe --build testbench.v
./obj_dir/Vtestbench

最后用 GTKWave 打开波形:

gtkwave wave.vcd
核心要点:整个流程就是:写汇编 → 编译成二进制 → 加载到仿真 → 看波形。这个流程会贯穿咱们整个课程,一定要亲手跑通一遍。

知识体系一览

下面这张图帮你理清今天装的所有工具之间的关系:

开发环境工具链 Verilator 仿真引擎 GTKWave 波形查看器 RISC-V GCC 编译器 Verilog 代码 C/汇编代码 VCD 波形文件 仿真 生成 工作流程 编写 Verilog + 汇编 → Verilator 仿真 → 生成 VCD → GTKWave 查看波形

这张图把今天装的三样工具串起来了。你写好的 Verilog 代码和编译好的 RISC-V 程序,交给 Verilator 去仿真,仿真结果输出成 VCD 波形文件,最后用 GTKWave 打开看信号变化。就这么简单。

好了,环境搭好了,第一个测试也跑通了。从下一章开始,咱们就要真正动手设计 CPU 核心了。到时候你会发现,今天花时间搭环境,绝对值得。


专注资料整理