购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 Verilog HDL的VCD文件

值变转储(Value Change Dump, VCD)是一种基于ASCII码的文件格式,用于记录由EDA仿真工具产生的信号信息。存在两种类型的VCD。

(1)四态VCD格式,随IEEE1364-1995一起发布。表示变量在0、1、x和z内的改变(不包含强度信息)。

(2)扩展VCD格式,随IEEE1364-2001一起发布。表示变量状态和强度信息的改变。

注: 本章只介绍四态VCD格式,不涉及扩展VCD格式。

1.5.1 Vivado创建四态VCD文件

在ModelSim中,提供了创建.vcd文件的功能。在ModelSim执行仿真前,在Transcript窗口中,输入下面的命令:

其中,hebin.vcd是VCD文件的名字,其中文件名可以由读者自行命名,test为测试模块的名字,Inst_wire_net为测试模块中所例化文件的名字,读者根据所使用测试文件的模块名字和引用模块的例化名字进行设置。

1.5.2 Verilog源创建四态VCD文件

从Verilog仿真源文件创建四态VCD文件的过程如图1.22所示,主要步骤如下所述。

图1.22 创建四态VCD文件

(1)在Verilog HDL源文件中,插入VCD系统任务$dumpfile,该任务用于定义转储文件以及指定需要转储的变量。

(2)运行仿真。

VCD文件是一个ASCII文件,它包含了头部信息、变量定义以及在任务调用时所有指定变量值的变化。在Verilog HDL中,可将下面的系统任务插入源文件中,用于创建和控制VCD文件。

1.指定转储文件的名字($dumpfile)

该系统任务用于指定VCD文件的名字,其语法格式为

其中,filename(可选)为VCD文件的名字。如果没有指定VCD文件的名字,默认的VCD文件为dump.vcd,如 initial $dumpfile (“module1.dump”)。

2.指定转储的变量($dumpvars)

该任务列出了所有需要转储到由$dumpfile所指定文件的变量,可以在模型中(如在不同的块中)根据需要经常调用该任务,但是应该在相同的仿真时间执行所有的$dumpvars任务,该任务的语法格式为

其中,level表示每个指定模块例子下面的多少级转储到VCD文件中。当设置为0时,将指定模块内和指定模块下的所有模块实例的变量转储到VCD文件中。参数0应用于指定模块实例的第二个参数,而不能用于单个的变量;list_of_modules_or_variables指明需要转储到VCD文件中模块的范围。

【例1.66】$dumpvars 系统任务Verilog HDL描述的例子1。

在该例子中,由于第一个参数是1,所以这个调用将转储模块top内的所有变量,它不会转储由模块top所例化任何模块内的变量。

【例1.67】$dumpvars 系统任务Verilog HDL描述的例子2。

在该例子中,$dumpvar任务将转储模块top以及top以下层次所有模块实例的变量。

【例1.68】$dumpvars 系统任务Verilog HDL描述的例子3。

在该例子中,$dumpvar任务将转储模块mod1以及以下层次模块实例的所有变量,以及模块mod2内的变量net1。参数0只用于模块实例top.mod1,而不用于单个变量top.mod2.net1。

3.停止和继续转储($dumpoff/$dumpon)

执行$dumpvars任务,使得在当前仿真时间单位结束时开始转储变化的值。调用$dumpoff任务将停止转储,调用$dumpon任务将继续转储。

当执行$dumpoff任务时,会生成一个检查点,将其中每个选定的变量转储为x值。稍后执行$dumpon任务时,每个变量都会在当时转储其值。在$dumpoff和$dumpon的间隔,不会转储任何更改的值。这两个任务提供了对仿真期间内所发生转储的控制机制。

【例1.69】 调用 $dumpoff $dumpon 系统任务Verilog HDL描述的例子。

这个例子在10个时间单位后启动VCD,在200个时间单位(第210个时间单位)后停止,在800个时间单位(第810个时间单位)后重新开始,在900个时间单位(第910个时间单位)后停止。

4.创建一个检查点($dumpall)

系统任务$dumpall用于在VCD文件中创建一个检查点,显示所有选择变量当前的值,语法格式如下:

当使能转储时,值变转储器记录了在每个时间递增时刻变量值的变化。在时间递增时刻,不会转储值没有变化的变量。

5.限制转储文件的大小($dumplimit)

系统任务$dumplimit用于设置VCD文件的大小,其语法格式如下:

其中,参数filesize用于设置VCD文件的最大容量(以字节计)。当VCD文件的大小到达设置的这个值时,停止转储,并在VCD中插入一个注释,用来表示达到了转储的限制。

6.在仿真期间读取转储文件($dumpflush)

系统任务$dumpflush用于清空操作系统的VCD文件缓冲区,确保将所有缓冲区内的数据保存到VCD文件中,其语法格式为

在执行完$dumpflush任务后,继续转储不会丢失值的变化。调用$dumpflush的一个通常应用是更新存储文件,这样应用程序可以在仿真期间读取VCD文件。

【例1.70】 调用$dumpflush系统任务Verilog HDL描述的例子。

这个例子给出了在Verilog HDL源文件中使用$dumpflush任务的方法。

【例1.71】 生成VCD文件Verilog HDL描述的例子,如代码清单1-26所示。

代码清单1-26 生成VCD文件的Verilog HDL描述

在这个例子中,转储文件的名字是verilog.dump,它用于转储模型中所有变量值的变化。当发生事件do_dump时,开始转储,持续500个时钟周期后停止,然后等待再次触发事件do_dump。每10000个时间步长,转储所有VCD变量当前的值。

1.5.3 四态VCD文件格式

转储文件以自由格式构建。命令之间用空格分隔,便于用文本编辑器阅读该文件。

VCD文件以头部信息段开始,包含日期、用于仿真的仿真器版本号和使用的时间标度。随后,文件包含转储范围和变量的定义,后面跟着在每个仿真时间递增时真实变化的值。只列出在仿真期间值发生变化的变量。在VCD文件中记录的仿真时间是跟随变量值变化仿真时间的绝对值。

对于每个实数值的变化,使用实数标识。对于所有其他变量值的变化,使用二进制格式0、1、x或z标识。不转储强度和存储器信息。

实数使用printf的%.16g格式转储,这保留了该数字的精度,输出64位IEEE 754双精度数的尾数中的所有53位。应用程序通过在scanf()中使用%g格式来读取实数。

值变转储器产生字符标识符用来表示变量。标识符码是由可打印字符组成的码,它们是ASCII字符集,从!到~(十进制的33到126)。

VCD不支持转储部分矢量的机制,如一个16位矢量的第8~15位([8:15])不能转储到VCD文件,取而代之,转储整个矢量([0:15])。此外,在VCD文件中也不能转储表达式,如a+b。

在VCD文件中的数据是大小写敏感的。

1.变量值的格式

变量可以是标量或矢量,每个类型以它们自己的格式转储。当转储标量变量值的变化时,在值和标识符之间没有任何空白符。转储矢量值的变化时,在基数字母和数字之间不能有任何空白符,但是在数字和标识符码之间可以有一个空白符。

对于每个值的输出格式是右对齐。向量的值以尽可能短的形式出现,即删除由左扩展值填充一个特殊向量宽度产生的冗余比特值。

用于向左扩展向量值的规则,如表1.11所示。表1.12给出了VCD缩短值的方法。

表1.11 向左扩展向量值的规则

表1.12 VCD将值缩短的方法

将事件以与标量相同的格式进行转储,如1*%。对于事件,然而值(在该例子中是1)是不相关的。只有标识符码(在这个例子中是*%)是重要的,在VCD文件中,用于指示在时间步长期间触发了事件。

2.关键字命令描述

四态VCD文件的语法格式为

其中,declaration_keyword关键字包括$comment、$date、$enddefinitions、$scope、$timescale、$upscope、$var和$version;simulation_keyword关键字包括$dumpall、$dumpoff、$dumpon和$dumpvars。

1)$comment

用于在VCD文件中插入一个注释,语法格式为

【例1.72】 $comment命令的例子。

2)$date

用于指示VCD文件生成的时间,语法格式为

【例1.73】 $date命令的例子。

3)$enddefinitions

用于标记头部信息和定义的结束,语法格式为

4)$scope

定义了被转储变量的范围,语法格式为

其中,scope_type为类型的范围,包括module、task、function、module、begin、fork。

【例1.74】 $scope命令的例子。

5)$timescale

标明在仿真时所用的时间标度,语法格式表示为

其中,time_number为1、10或100;time_unit为s、ms、us、ns、ps或fs。

【例1.75】 $timescale命令的例子。

6)$upscope

指示在一个设计层次中,范围更改为下一个较高的层次,其语法格式表示为

7)$var

打印正在转储变量的名字和标识符码,其语法格式表示为

其中:

(1)var_type为变量类型,包括event、integer、parameter、real、realtime、reg、supply0、supply1、time、tri、triand、trior、trireg、tri0、tri1、wand、wire、wor。

(2)size为变量的位宽。

(3)identifier_code为所指定变量的名字,它是可打印的ASCII字符。

①msb index表示最高有效位,lsb index表示最低有效位。

②可以有多个引用名字映射到相同的标识符码。比如,在一个电路中,可以将net10和net15进行互连。因此有相同的标识符码。

③向量中的各个位,可以单个进行转储。

④标识符是模型中正在转储变量的名字。

注: 在该部分,uwire类型的网络有一个wire类型的变量。

【例1.76】 $var命令的例子。

8)$version

表示使用哪个版本的VCD书写器用于生成VCD文件,使用$dunpfile系统任务创建文件,其语法格式为

【例1.77】 $version命令的例子。

9)dumpall

用于指示所有转储变量当前的值,其语法格式为

【例1.78】 $dumpall命令的例子。

10)dumpoff

表示用x值转储所有的变量,其语法格式为

【例1.79】 $dumpoff命令的例子。

11)dumpon

表示继续转储,并且列出所有转储变量当前的值,其语法格式为

【例1.80】 $dumpon命令的例子

12)dumpvars

列出所有转储变量的初始值,其语法格式为

【例1.81】 $dumvar命令的例子。 pk5utAFeY6kSyDdP1Ckfu+wglvOPJG3bkGojEJr9TDqWhduD17Ro2KeFLfwfldxX

点击中间区域
呼出菜单
上一章
目录
下一章
×