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

一生一芯学习记录(一):简单介绍 + 建立Verilator仿真环境
一生一芯学习记录一简单介绍 建立Verilator仿真环境一、项目简介「一生一芯」是什么「一生一芯」是由中国科学院计算技术研究所发起的开源芯片设计教育项目旨在让学习者从零开始设计并流片一颗 RISC-V 处理器。项目的核心理念是“一生中亲手设计一颗芯片”强调实践与系统性学习。通过该项目你可以- 理解指令集架构ISA到硬件实现的完整链路- 掌握 Verilog/SystemVerilog 硬件描述语言- 使用开源工具链Verilator、GTKWave、Spike 等进行仿真验证- 最终将设计提交到开源 PDK 并流片作为系列的第一篇本文章将聚焦于建立Verilator 仿真环境这是后续所有实验的基础。## 二、为什么选择 VerilatorVerilator 是一个高性能的开源 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 cstdlibint 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 - Cverilator -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: a10 b20 sum30 carry0Test 1: aff b01 sum00 carry1Test 2: a7f b80 sumff carry0Test 3: a00 b00 sum00 carry0Simulation 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 单周期处理器敬请期待