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 中,加入以下系统函数:

verilog 复制代码
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 代码

verilog 复制代码
module counter(input clk, input rstn, output reg [3:0] count);
    always @(posedge clk or negedge rstn) begin
        if (!rstn)
            count <= 0;
        else
            count <= count + 1;
    end
endmodule

🧾 2. Testbench(包含 VCD)

verilog 复制代码
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

bash 复制代码
gtkwave wave.vcd

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


六、进阶技巧

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

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

verilog 复制代码
$dumpvars(0, tb.uart_inst);

2️⃣ 控制转储时间段

verilog 复制代码
$dumpoff;
#200;
$dumpon;

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

verilog 复制代码
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
最佳实践 控制范围、分段转储
相关推荐
FPGA_无线通信3 小时前
xilinx FPGA 原语介绍
fpga开发
brave and determined3 小时前
可编程逻辑器件学习(day30):数字电路设计中的流水线技术:原理、实现与优化
学习·fpga开发·verilog·fpga·数字电路·硬件设计·嵌入式设计
步达硬件6 小时前
【FPGA】FPGA初学者开发板选择及学习路线
学习·fpga开发
贝塔实验室6 小时前
Altium Designer 6.0 初学教程-如何从原理图及PCB 中生成网表并且实现网表的加载
fpga开发·硬件架构·硬件工程·学习方法·射频工程·基带工程·pcb工艺
云空6 小时前
《从芯片到系统:解码FPGA如何重塑数字世界的硬件逻辑》
fpga开发
brave and determined17 小时前
可编程逻辑器件学习(day29):Verilog HDL可综合代码设计规范与实践指南
深度学习·fpga开发·verilog·fpga·设计规范·硬件编程·嵌入式设计
碎碎思2 天前
不用 JTAG 也能刷 FPGA:TinyFPGA-Bootloader 让比特流加载更简单
fpga开发
贝塔实验室2 天前
Altium Designer 6.0 初学教程-在Altium Designer 中对PCB 进行板层设置及内电层进行分割
嵌入式硬件·fpga开发·编辑器·硬件工程·信息与通信·信号处理·pcb工艺
ThreeYear_s2 天前
【FPGA+DSP系列】——MATLAB simulink单相PWM全控整流电路基础版
开发语言·matlab·fpga开发
forgeda2 天前
赛灵思FPGA的市场份额,要从2025年的55%,进一步提升到2030年的70%,凭什么?
ai·fpga开发