当前位置: 首页 > news >正文

FPGA基础 -- Verilog 的值变转储文件(VCD:Value Change Dump)

Verilog 的“值变转储文件(VCD:Value Change Dump)”,这是一项在仿真调试中至关重要的技术,可以帮助你“看见”RTL中每个信号随时间的变化过程。


一、什么是 Verilog 的值变转储文件(VCD)

VCD 文件是一种标准格式的文本文件,全称为 Value Change Dump,用于记录 Verilog 仿真过程中信号的取值变化。

它的作用类似于逻辑分析仪的抓取波形,但作用于 RTL 层,用于:

  • 波形观察(使用 GTKWave 等工具)
  • 行为验证
  • 时序调试
  • 测试激励验证

二、VCD 文件的生成流程

📌 步骤一:在 Testbench 中添加转储语句

在 Verilog 的仿真 testbench 中,加入以下系统函数:

initial begin$dumpfile("wave.vcd");       // 设置输出的 VCD 文件名$dumpvars(0, tb_top);        // 设置要转储的模块或层级
end

参数解释:

语句含义说明
$dumpfile("file.vcd")设置输出 VCD 文件的名称。必须是 .vcd 后缀。
$dumpvars(level, scope)设置记录的信号层级深度和作用域;level = 0 表示全记录。
$dumpoff / $dumpon动态关闭/打开转储(常用于减小文件大小)。

三、VCD 文件格式结构简要

VCD 文件是标准的纯文本格式,其结构如下:

$timescale 1ns $end
$scope module tb_top $end
$var wire 1 a clk $end
$var wire 1 b rstn $end
...
$upscope $end
$enddefinitions $end
#0
0a
1b
#5
1a
#10
0b

每部分含义:

字段含义
$timescale指定时间单位(仿真单位)
$var定义变量名、宽度、标识符、别名
#<time>当前时间戳
0a / 1a标识符 a 的值变为 0 或 1

四、综合示例

🧾 1. RTL 代码

module counter(input clk, input rstn, output reg [3:0] count);always @(posedge clk or negedge rstn) beginif (!rstn)count <= 0;elsecount <= count + 1;end
endmodule

🧾 2. Testbench(包含 VCD)

module tb;reg clk = 0;reg rstn = 0;wire [3:0] count;counter uut(.clk(clk), .rstn(rstn), .count(count));always #5 clk = ~clk;initial begin$dumpfile("wave.vcd");$dumpvars(0, tb);#10 rstn = 1;#100 $finish;end
endmodule

五、VCD 文件查看工具

最常用的工具是开源波形查看器 GTKWave

gtkwave wave.vcd

支持搜索、跳转、游标测量、导出截图等功能,适用于跨平台(Windows/Linux)使用。


六、进阶技巧

1️⃣ 有选择性地转储信号

只记录某一子模块,减小文件体积:

$dumpvars(0, tb.uart_inst);

2️⃣ 控制转储时间段

$dumpoff;
#200;
$dumpon;

常用于忽略初始化过程,缩小文件:

initial begin$dumpfile("wave.vcd");$dumpvars(0, tb);#50 $dumpoff;#100 $dumpon;
end

3️⃣ 转储多位总线的显示

多位信号如 reg [7:0] data 会以:

b00000000 x  // 二进制格式

显示其值为 x 对应的名称。


七、常见问题与注意事项

问题或注意点说明
文件太大控制 $dumpvars 的范围或使用 $dumpoff
不支持非标准类型real 等类型不支持,使用 $fwrite 输出
Vivado 不直接支持 $dumpfile使用 write_vcd 或使用第三方仿真器

八、小结

项目内容
文件格式.vcd,文本格式
用途波形查看、调试、验证
生成方式$dumpfile, $dumpvars
查看工具GTKWave
最佳实践控制范围、分段转储
http://www.lqws.cn/news/458713.html

相关文章:

  • Spring Boot + MyBatis + Vue:全栈开发中的最佳实践
  • 压铸件超声波清洗设备有哪些常见的故障原因?
  • Android Kotlin 用法对比Java使用小结
  • 阿里云OSS对象云储存入门操作
  • 前端工程结构设计指南:如何让模块解耦、易维护、可拓展
  • 讯方“教学有方”平台获华为昇腾应用开发技术认证!
  • Linux系统时间不对导致mysql初始化失败:Data Dictionary initialization failed.(数据字典版本验证失败)
  • 【案例分享】如何用 DHTMLX Scheduler 构建灵活高效的资源调度系统?
  • Vue 比较两个数组对象,页面展示差异数据值
  • 1.22Node.js 中操作 Redis
  • 党建赋能 医校协同|广州附医华南医院与湖南中医药高等专科学校签约携手共育英才
  • Unity3D仿星露谷物语开发67之创建新的NPC
  • HTTP Server
  • 基于RISV-V的矿业网关,支持矿鸿等国产系统
  • 树莓派倾斜传感器实验指导书
  • 为什么你的vue项目连接不到后端
  • Linux 内核同步管理全解:原理 + 实战 + 考点
  • 【服务器R环境架构】基于 micromamba下载 R 库包
  • 企业实践 | 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装指南
  • 无人机吊舱热成像伪彩模式设计分析
  • Hadoop 技术生态体系
  • 如何填写“appium inspector”内容?
  • RAG工程落地:处理文档中表格数据
  • “地标界爱马仕”再启:世酒中菜联袂陈汇堂共筑新会陈皮顶奢产业
  • @annotation:Spring AOP 的“精准定位器“
  • 【MySQL数据库 | 第八篇】DQL语句 - 基础/条件查询
  • 20250620在荣品的PRO-RK3566开发板的Android13系统的uboot阶段就拉高GPIO2C6【driver模式】
  • 分布式ID生成利器:Snowflake UUID原理解析与实践
  • Lua 事务双写、RedisGears 异步双写、零停机索引迁移与容量预估
  • 数据结构第八章(六)-置换选择排序和最佳归并树