第1章 开发环境搭建:RISC-V GNU工具链编译、Verilator仿真环境配置、Vivado/VCS等EDA工具简介
说实话,很多初学者一上来就急着写代码,结果编译报错、仿真跑不通,折腾半天才发现是环境没配好。我见过太多这样的案例了。所以咱们第一章,先把家伙事儿备齐。
RISC-V开发环境,说白了就三块:编译工具链(把C代码变成机器码)、仿真器(验证你的Verilog对不对)、EDA工具(做综合、布局布线)。咱们一个一个来。
核心知识点一览:
- RISC-V GNU工具链的编译与安装
- Verilator仿真环境配置
- Vivado/VCS等EDA工具简介
- 环境验证与第一个Hello World
1.1 RISC-V GNU工具链:从源码到可执行文件
工具链是什么?就是把你写的C代码,一步步变成RISC-V处理器能认识的机器码。我习惯用riscv-gnu-toolchain这个开源项目,它包含了gcc、binutils、glibc/newlib等全套组件。
编译安装步骤(以Ubuntu 20.04为例):
# 安装依赖
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev \
libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf \
libtool patchutils bc zlib1g-dev libexpat-dev
# 克隆仓库
git clone https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain
# 配置(我一般选newlib,轻量级,适合嵌入式)
./configure --prefix=/opt/riscv --with-arch=rv32imc --with-abi=ilp32
# 编译(-j后面跟CPU核心数,别设太大,容易内存爆掉)
make -j$(nproc)
我的经验:第一次编译大概要40分钟到1小时,取决于你的机器。我建议你泡杯咖啡,或者先去把Verilator也下载了。另外,--prefix路径别用/usr/local,万一以后要换版本,直接删/opt/riscv就行,干净利落。
装完之后,验证一下:
/opt/riscv/bin/riscv32-unknown-elf-gcc --version
# 应该能看到类似 "riscv32-unknown-elf-gcc (gcb9a8c1) 12.2.0" 的输出
嗯,看到版本号就说明成了。接下来写个最简单的C程序试试:
// hello.c
int main() {
int a = 1, b = 2;
int c = a + b;
return c;
}
// 编译
/opt/riscv/bin/riscv32-unknown-elf-gcc -O2 -march=rv32imc -o hello.elf hello.c
// 反汇编看看生成的指令
/opt/riscv/bin/riscv32-unknown-elf-objdump -d hello.elf
你会看到类似addi、add这样的RISC-V指令。说实话,第一次看到自己写的C代码变成汇编指令,还是挺有成就感的。
注意:如果你用的是rv64架构,记得把--with-arch=rv64imac、--with-abi=lp64。我刚开始学的时候没注意,编译出来的程序在32位核上跑直接崩了,查了半天才发现是ABI不匹配。
1.2 Verilator:开源仿真利器
Verilator是个好东西。它能把Verilog代码转换成C++代码,然后编译成可执行文件来仿真。速度比传统的事件驱动仿真器快很多,适合做大规模数字电路的验证。
安装Verilator:
# 方法一:apt安装(版本可能较旧)
sudo apt-get install verilator
# 方法二:源码编译(推荐,我一般用这个)
git clone https://github.com/verilator/verilator
cd verilator
autoconf
./configure
make -j$(nproc)
sudo make install
# 验证
verilator --version
避坑指南:我曾经在Ubuntu 18.04上直接用apt装,结果版本是3.8,不支持SystemVerilog的一些新语法。后来老老实实源码编译了4.2版本,问题全解决了。所以如果你要做稍微复杂点的验证,建议源码编译。
写个简单的Verilog模块来测试:
// 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'b1;
end
endmodule
然后用Verilator仿真:
verilator --cc counter.v --exe sim_main.cpp
make -C obj_dir -f Vcounter.mk
./obj_dir/Vcounter
这里sim_main.cpp需要你自己写一个测试平台,驱动时钟和复位。说白了就是C++代码里调用Verilator生成的模型。刚开始可能觉得有点绕,但用熟了会发现,这种方式调试起来特别方便——你可以直接在C++里加printf,不用折腾波形文件。
1.3 Vivado与VCS:工业级EDA工具
讲完开源的,咱们聊聊商业工具。虽然咱们课程主要用Verilator做仿真,但作为芯片工程师,Vivado和VCS你迟早得碰。
| 工具 | 厂商 | 主要用途 | 我的评价 |
|---|---|---|---|
| Vivado | AMD Xilinx | FPGA综合、实现、调试 | 适合做原型验证,GUI很强大 |
| VCS | Synopsys | ASIC仿真、波形调试 | 工业标准,但License贵得离谱 |
| ModelSim/Questa | Siemens EDA | 仿真、调试 | 入门简单,学校用得比较多 |
Vivado快速上手:
安装Vivado时,我建议选Vivado HL WebPACK版本,免费的,功能对于学习来说完全够用。创建一个工程,添加Verilog文件,运行综合(Synthesis),然后看资源利用率报告——这些操作你跟着做一遍就熟了。
VCS呢?说实话,个人学习基本用不上。一套License一年几十万人民币,公司才买得起。但你要知道它的存在,面试的时候可能会被问到。VCS的用法和Verilator有点像,也是编译Verilog然后仿真,只不过它支持更完整的SystemVerilog和UVM。
我的建议:学习阶段,Verilator完全够用。等你真正进了公司,VCS/Vivado自然有人教你。别在工具安装上花太多时间,重点是把RISC-V架构和Verilog设计搞明白。
1.4 环境验证:跑通第一个RISC-V程序
最后,咱们把工具链和仿真器串起来,跑一个完整的RISC-V程序验证环境。
步骤很简单:
- 用riscv-gcc编译C程序,生成.elf文件
- 用Verilator仿真一个RISC-V处理器核(比如picorv32)
- 把.elf文件加载到处理器内存中,运行
这里我推荐用picorv32,一个轻量级的RISC-V核,代码量小,适合学习。
# 下载picorv32
git clone https://github.com/YosysHQ/picorv32
cd picorv32
# 编译测试程序(假设你已经配好了工具链)
riscv32-unknown-elf-gcc -O2 -march=rv32imc -o test.elf test.c
# 用Verilator仿真
verilator --cc picorv32.v --exe sim.cpp
make -C obj_dir -f Vpicorv32.mk
./obj_dir/Vpicorv32 test.elf
如果看到终端打印出"Hello, RISC-V!"或者一串数字,恭喜你,环境搭建成功了!
一个小技巧:如果你不想每次都敲一长串路径,可以把/opt/riscv/bin加到~/.bashrc的PATH里。我个人的做法是写一个setup_env.sh脚本,每次开新终端就source一下,省事。
好了,环境搭好了,后面咱们就可以专心写代码了。记住,工具只是手段,理解RISC-V的指令集架构和Verilog的硬件描述思想,才是这门课的核心。
公众号:蓝海资料掘金营,微信deep3321