Verilog系列:【23】VCD内部解剖
VCD(ValueChange Dump)是用ASCII记录了被选择信号在仿真过程中的变化情况,同时还记录了一些测试向量生成时的仿真信息,例如仿真时间精度等.目前常用的VCD主要有两种格式:
四值格式:记录了信号的数值变化情况,这里的数值仅包含0,1,x,z,不包含相关信号强度的信息;
扩展格式:记录了信号数值变化的所有情况;
本文仅以四值格式VCD为例进行详述.
1 VCD生成常用的系统任务
在Verilog中尝试用以下的系统任务保存测试向量VCD.
1.1 $dumpfile
该任务主要用来指定要生成的VCD文件名.
【示例】
1.2 $dumpvars
该任务主要用来指定将那些变量的信息保存到$dumpfile指定的VCD文件中,其格式主要有两种:一种是有参数的,一种是没有参数的.
无参数:
该任务执行后将会将所有的变量变化情况都记录到VCD文件中.
有参数:
该任务的第一个参数用来指定从当前层开始向下记录多少层的模块的信号变化情况,第二个参数指定记录信号开始的模块(例化名).当第一个参数设置为0时将会将指定的层以下的所有层次的信号变化情况都记录下来,这里需要注意,此时的参数0-只是对后续模块参数有效,对于变量参数不影响.
【示例】仅记录top层下的所有信号的变化情况,但是不记录例化在top层下的所有信号的变化情况.
【示例】记录从top层开始的所有模块中信号的变化情况.
【示例】记录特定模块以下所有层信号变化情况和其他模块变量的变化情况
1.3 $dumpoff和$dumpon
$dumpvars调用后在调用的时间槽的最后开始记录信号的变化情况,当时用$dumpoff时记录挂起,此时将会产生一个记录检查点,检查点中记录的所有被选择的变量值为x,当再次使用$dumpon后,挂起的记录将会继续进行,而在$dumpoff和$dumpon之间的变化将不会进行记录,而是以x作为记录.
【示例】
1.4 $dumpall
1.5 $dumplimit
1.6 $dumpflush
2 VCD文件格式
VCD文件通常由三部分组成:头信息区(HeaderInformation),节点信息区(Node Information),数值变化区(Value Change).VCD文件的开始部分为头信息区,其中包括VCD产生日期、仿真器版本以及仿真时间精度等信息.节点信息区主要记录了哪些变量信号将被记录在VCD中以及在VCD中对应这些变量信号的标识符(ASCII,字符的范围从!到~,在码表中对应的十进制数为33到126).数值变化区主要记录了那些随着仿真时间推移发生变化的变量信号.
注意事项:
-
VCD中记录的数据是区分大小写的;
-
VCD不会仅记录一个矢量的一部分,也不会记录表达式;
-
记录信号的数据格式
VCD中记录的变量一般主要包括标量和矢量,每种类型的信号被记录在VCD中的方式也略有差异.
-
标量变量一般记录时,标识符与具体对应数值之间没有空格;
-
矢量变量记录时,需要分两种情况:
-
矢量变量每一位对应一个标识符,此时记录的每一位与记录标量变量一样;
-
矢量变量整体对应一个标识符时,此时标识符与对应记录的数值之间有一个空格,记录数值的格式为:<进制><数字>;
一般矢量数字的格式为右对齐,可能记录数据本身的位数与矢量定义不一致,此时会对数据的高位进行填充处理,一般遵循的高位补充规则如下表所示:
【示例】
2.2 VCD中常见的关键字
在VCD文件中,常见关键字命令如下表所示:
2.2.1 $comment
2.2.2 $date
2.2.3 $enddefinitions
2.2.4 $scope
2.2.5 $timescale
2.2.6 $upscope
2.2.7 $version
2.2.8 $var
2.2.9 $dumpall
2.2.10 $dumpoff
2.2.11 $dumpon
2.2.10 $dumpvars
【示例】注意示例中各关键字说明