一生一芯学习记录(一):简单介绍 + 建立Verilator仿真环境

📅 2026/7/28 10:19:00 👁️ 阅读次数 📝 编程学习
一生一芯学习记录(一):简单介绍 + 建立Verilator仿真环境

一生一芯学习记录(一):简单介绍 + 建立Verilator仿真环境

一、项目简介:「一生一芯」是什么?「一生一芯」是由中国科学院计算技术研究所发起的开源芯片设计教育项目,旨在让学习者从零开始设计并流片一颗 RISC-V 处理器。项目的核心理念是“一生中亲手设计一颗芯片”,强调实践与系统性学习。通过该项目,你可以:- 理解指令集架构(ISA)到硬件实现的完整链路- 掌握 Verilog/SystemVerilog 硬件描述语言- 使用开源工具链(Verilator、GTKWave、Spike 等)进行仿真验证- 最终将设计提交到开源 PDK 并流片作为系列的第一篇,本文章将聚焦于建立Verilator 仿真环境,这是后续所有实验的基础。## 二、为什么选择 Verilator?Verilator 是一个高性能的开源 Verilog/SystemVerilog 仿真器。相比于其他仿真器(如 Icarus Verilog、Modelsim),它的优势在于:-速度快:将 Verilog 代码编译为 C++ 代码,然后通过编译优化获得极高的仿真性能-开源免费:无需商业许可证,适合个人学习-与 C++/Python 集成:可以轻松编写测试激励(testbench)和验证环境-支持 SystemVerilog:涵盖大多数常用语法(如 interface、assertion 等)## 三、环境搭建:从零开始安装 Verilator### 3.1 系统要求推荐使用 Ubuntu 20.04/22.04 或 Debian 11/12。本教程基于Ubuntu 22.04。### 3.2 安装依赖首先更新系统并安装编译工具和依赖库:bashsudo apt updatesudo apt install -y git build-essential autoconf flex bison \ libfl-dev libgmp-dev libmpfr-dev libmpc-dev \ libreadline-dev help2man perl-doc ccache### 3.3 从源码编译安装 VerilatorVerilator 的最新版本通常需要通过源码编译(apt 源中的版本可能较旧)。建议安装 v5.0 以上版本。bash# 1. 克隆 Verilator 仓库git clone https://github.com/verilator/verilator.gitcd verilator# 2. 配置编译选项(推荐开启最大优化)autoconfexport VERILATOR_ROOT=$(pwd)./configure --prefix=/usr/local# 3. 编译(使用多核加速)make -j$(nproc)# 4. 安装sudo make install验证安装是否成功:bashverilator --version# 输出类似: Verilator 5.021 2024-01-15 rev v5.020-4-g7b7e69f2## 四、实战演练:第一个 Verilator 仿真项目下面我们通过一个经典的加法器模块来测试 Verilator 环境是否正常工作。### 4.1 编写 RTL 代码创建项目目录并编写 Verilog 文件:bashmkdir -p ~/ysyx_verilator_democd ~/ysyx_verilator_demo文件:adder.vverilog// 一个简单的 8 位加法器模块// 输入:两个 8 位无符号数 a, b// 输出:8 位和 sum,以及进位 carrymodule adder ( input [7:0] a, input [7:0] b, output [7:0] sum, output carry); // wire 类型用于计算中间结果 wire [8:0] result; // 9 位,最高位为进位 assign result = a + b; assign sum = result[7:0]; // 取低 8 位 assign carry = result[8]; // 取第 9 位作为进位endmodule### 4.2 编写 C++ 测试激励Verilator 需要 C++ 代码来驱动仿真。创建主测试文件:文件:sim_main.cppcpp#include <verilated.h> // Verilator 核心头文件#include <verilated_vcd_c.h> // VCD 波形输出支持#include "Vadder.h" // Verilator 生成的模块类(注意前缀 V)#include <cstdio>#include <cstdlib>int main(int argc, char** argv) { // 初始化 Verilator 上下文 VerilatedContext* contextp = new VerilatedContext; contextp->commandArgs(argc, argv); // 创建加法器模块实例 Vadder* top = new Vadder(contextp); // 启用波形追踪(可选,用于 GTKWave 查看) VerilatedVcdC* tfp = new VerilatedVcdC; contextp->traceEverOn(true); // 开启追踪 top->trace(tfp, 99); // 设置追踪深度 tfp->open("waveform.vcd"); // 输出波形文件 // 测试用例:遍历所有可能的输入组合(仅测试 4 个典型值) for (int test = 0; test < 4; test++) { // 设置输入值 switch (test) { case 0: top->a = 0x10; top->b = 0x20; break; // 16 + 32 = 48 case 1: top->a = 0xFF; top->b = 0x01; break; // 255 + 1 = 256 (溢出) case 2: top->a = 0x7F; top->b = 0x80; break; // 127 + 128 = 255 case 3: top->a = 0x00; top->b = 0x00; break; // 0 + 0 = 0 } // 评估组合逻辑(不需要时钟沿) top->eval(); // 输出结果到控制台 printf("Test %d: a=%02x b=%02x sum=%02x carry=%d\n", test, top->a, top->b, top->sum, top->carry); // 记录波形到 VCD 文件 tfp->dump(contextp->time()); contextp->timeInc(1); // 时间前进 1 单位 } // 清理资源 top->final(); tfp->close(); delete top; delete contextp; printf("Simulation finished successfully!\n"); return 0;}### 4.3 编译和运行使用 Verilator 将 Verilog 代码转换为 C++ 并编译:bash# 1. Verilator 编译 RTL -> C++verilator -Wall --cc adder.v --exe sim_main.cpp -o Vadder_sim# 2. 编译 C++ 并链接生成可执行文件make -C obj_dir -f Vadder.mk Vadder_sim# 3. 运行仿真./obj_dir/Vadder_sim预期输出:Test 0: a=10 b=20 sum=30 carry=0Test 1: a=ff b=01 sum=00 carry=1Test 2: a=7f b=80 sum=ff carry=0Test 3: a=00 b=00 sum=00 carry=0Simulation finished successfully!### 4.4 查看波形安装 GTKWave 并打开波形文件:bashsudo apt install gtkwavegtkwave waveform.vcd在 GTKWave 中,选择adder模块,添加a,b,sum,carry信号即可查看时序波形。## 五、常见问题与调试技巧### 5.1 编译错误排查-错误:Vadder.h未找到:检查是否在obj_dir目录下执行编译命令-错误:verilated.h未找到:确认VERILATOR_ROOT环境变量设置正确-链接错误:未定义verilated_vcd_c相关函数:编译时需添加-DVL_DEBUG或检查--trace参数### 5.2 性能优化建议对于大型设计,可以开启以下编译选项加速仿真:bashverilator -Wall --cc --build --trace-fst \ --threads 4 --output-split 20000 \ top.v --exe sim_main.cpp---trace-fst:使用 FST 格式波形(比 VCD 更小更快)---threads:启用多线程仿真---build:自动调用 make 编译## 六、总结本文从零开始介绍了「一生一芯」项目的基本概念,并详细演示了如何在 Ubuntu 系统上搭建 Verilator 仿真环境。通过一个简单的加法器示例,我们完成了以下关键步骤:1. 理解 Verilator 相比其他仿真器的优势(性能、开源、可集成性)2. 掌握从源码编译安装 Verilator 的方法3. 学会编写 Verilog 模块和对应的 C++ 测试激励4. 体验完整的仿真流程:编译 → 运行 → 波形查看在后续的学习中,你将基于这个环境逐步实现更复杂的处理器模块,包括寄存器堆、ALU、流水线控制等。建议将此环境作为你的“数字电路实验箱”,多动手编写和调试代码。下一篇文章将介绍如何用 Verilator 驱动一个完整的 RISC-V 单周期处理器,敬请期待!