RTL基本知识: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层开始的所有模块中信号的变化情况.

【示例】记录特定模块以下所有层信号变化情况和其他模块变量的变化情况

记录了top.mod1及其所有层次的信号的变化情况,同时也记录了top.mod2.net1的变化情况,但是这里需要注意的是,第一个参数的作用对象为模块mod1,不是mod2.net1.

1.3 $dumpoff和$dumpon

$dumpvars调用后在调用的时间槽的最后开始记录信号的变化情况,当时用$dumpoff时记录挂起,此时将会产生一个记录检查点,检查点中记录的所有被选择的变量值为x,当再次使用$dumpon后,挂起的记录将会继续进行,而在$dumpoff和$dumpon之间的变化将不会进行记录,而是以x作为记录.

【示例】

1.4 $dumpall

该任务会在VCD文件中创建一个检查点,其中记录了当前时刻所要记录的信号的值,这里需要注意,VCD记录功能使能后,VCD仅记录随着时间递增有变化的信号,如果相关的信号没有发生变化,那么将不会在对应时段进行记录,但是如果使用$dumpall那么不管当前时刻前后相关信号是否发生变化,所有要被记录的信号都会记录到VCD中.当该命令紧跟着$dumpvars时,将不会在VCD记录中出现,因为此时该命令的功能与$dumpvars一致,即记录所有要被记录的变量信号的值.

1.5 $dumplimit

该任务可以限定VCD文件的大小,其中参数的单位为字节,当记录的VCD文件大小达到限制,将会在文件的末尾插入如下语句表示VCD文件记录的大小已经达到设定值:

1.6 $dumpflush

该任务主要用来清理VCD文件占用的系统缓存,当然在清理之前会将缓存中的数据保存到VCD文件中,一般情况下只有仿真结束了才能对VCD文件进行操作,在代码中增加该任务,可以在放真的过程中对VCD文件进行操作,因为该任务在仿真过程中将缓存中的数据更新到VCD中,所以不用等到仿真结束即可查看VCD文件.

2 VCD文件格式

VCD文件通常由三部分组成:头信息区(HeaderInformation),节点信息区(Node Information),数值变化区(Value Change).VCD文件的开始部分为头信息区,其中包括VCD产生日期、仿真器版本以及仿真时间精度等信息.节点信息区主要记录了哪些变量信号将被记录在VCD中以及在VCD中对应这些变量信号的标识符(ASCII,字符的范围从!到~,在码表中对应的十进制数为33到126).数值变化区主要记录了那些随着仿真时间推移发生变化的变量信号.

注意事项:

  • VCD中记录的数据是区分大小写的;
  • VCD不会仅记录一个矢量的一部分,也不会记录表达式;
  • 记录信号的数据格式

VCD中记录的变量一般主要包括标量和矢量,每种类型的信号被记录在VCD中的方式也略有差异.

  • 标量变量一般记录时,标识符与具体对应数值之间没有空格;
  • 矢量变量记录时,需要分两种情况:
  • 矢量变量每一位对应一个标识符,此时记录的每一位与记录标量变量一样;
  • 矢量变量整体对应一个标识符时,此时标识符与对应记录的数值之间有一个空格,记录数值的格式为:<进制><数字>;

一般矢量数字的格式为右对齐,可能记录数据本身的位数与矢量定义不一致,此时会对数据的高位进行填充处理,一般遵循的高位补充规则如下表所示:

【示例】

从向量中可以看到,信号RIO2_REFCLK_M[3:0]在时刻#5000000、#6500000、#12000000分别为4‘b1111,4‘b0000,4‘b1111.这里大家需要注意矢量变量在VCD中记录的格式.

2.2 VCD中常见的关键字

在VCD文件中,常见关键字命令如下表所示:

2.2.1 $comment

主要是在VCD中插入一些注释提示信息等.

2.2.2 $date

主要记录了VCD是生成的时间.

2.2.3 $enddefinitions

标识头信息区和节点信息区的结束.

2.2.4 $scope

主要指示被记录变量的作用范围,一般对于以下模块关键字进行范围标志:module,task,function,begin(具有label),fork(具有label).

2.2.5 $timescale

指示VCD生成时使用的时间精度.

2.2.6 $upscope

指示设计层次结构的变化,主要是从当前层跳转到比当前层更高一级的层次时使用,即表示当前层相关描述已经结束.

2.2.7 $version

指示产生VCD的仿真器的名字和版本等信息.

2.2.8 $var

指示当前标识符和信息名对应关系.

2.2.9 $dumpall

指示当前为一个检查点,记录了所有要被记录的信号的值,而不管该信号是否发生变换.

2.2.10 $dumpoff

该命令后所有被记录的信号的值为x,直到遇到$dumpon;

2.2.11 $dumpon

表示再次使能了记录变量有效变化到VCD.

2.2.10 $dumpvars

其后紧跟着所有要被记录的变量信号的初始值.

【示例】注意示例中各关键字说明

欢迎大家关注魏老师的微信公众号:芯光灿烂

原文地址:https://www.cnblogs.com/xgcl-wei/p/9688827.html

时间: 2024-08-30 11:20:38

RTL基本知识:VCD内部解剖的相关文章

RTL基本知识:缺失分号的后果

在使用Verilog进行设计过程中,经常会遇到某些条件判断语句中的分支没有执行,有些for循环仅执行一次的情况,特别是在过程性赋值语句中.其中很大一部分是因为错误使用了":"导致的.因为Verilog源自C语言,根据其语言特性,":"在Verilog中本身是一条单独的空语句,只是岂不进行任何具体操作而已,但是这样的特点造成了":"可以出现在设计的很多地方,顺利的通过编译甚至仿真,引起不容易察觉的错误.本文将针对这种情况探讨其中原因,并以示例说明.

RTL基本知识:全加器设计(VHDL)

[设计要求] 使用层次化设计方法,用VHDL语言设计四位二进制全加器,并进行仿真. [设计目的] 考查对于VHDL元件例化语法的熟悉程度: 考查对于数字电路中全加器工作原理的理解: [设计思路] 用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器.一位全加器可以处理低位进位,并输出本位加法进位.多个一位全加器进行级联可以得到多位全加器. 第一步:一位全加器: 第二步:多位全加器,在其中例化一位全加器实现: 1 一位全加器 a和b为两位二进制数据,cin为前级进位位,cout为当前计算

RTL基本知识:关于coverage

 Coverage Overview 随着芯片规模越来越大,集成的功能越来越多,一次性流片费用的增加,市场竞争的日益激烈,如何在验证和测试中解决判断验证充分性和完备性的问题逐步成为业界验证工作的热门话题. 并且伴随验证技术的进一步发展,验证技术也发生了巨大的变化,覆盖率作为其中一种判断验证充分性的手段已经被广泛的应用在集成电路的设计验证工作中. 本文将主要介绍设计验证工作中经常遇到的覆盖率的基本概念,希望对需要的朋友有所帮助. Test Coverage Fault Coverage consi

RTL基本知识:线网或变量宽度与端口宽度不匹配

在使用Verilog进行数字设计或者构建验证平台时,如果连接模块端口的线网或变量的宽度与端口定义的宽度不一致,在进行仿真时将有可能出现逻辑功能与期望不一致的情况,本文将对此类情况进行示例分析. 首先,在IEEE 1364-2001中,模块的端口对于信号的传输类似于连续赋值语句对于信号的传递,因此,对于连续赋值语句的要求也适用于信号通过端口的传递过程(对此可以理解,在具体物理实现后的是不存在模块端口的,信号将通过线网在电路中传输).其次,Verilog中,与输入端口(input)和双向端口(ino

RTL基本知识:如何正确在敏感信号列表中包含function中的信号

在使用Verilog建模组合逻辑时,经常会使用"@*"的方式实现将进程中素有输入信号隐含加入到敏感信号列表中.但是如果该进程中包含对函数的引用时,尽管使用"@*",综合前后的仿真结果还是有出现不一致的情况.本文将对此进行示例说明. 1  问题示例 Verilog中可以在always后使用"@*"来代替冗长的敏感信号列表,这样做虽然在一定程度上可以保证仿真和综合的一致性,但是在一些情况下并不完全正确.例如下例,其中的函数引用了全局变量start,期

RTL基本知识:task和function

在使用Verilog进行设计的过程中,使用task和function在同一个module中多次调用,充分提高了代码的复用性,有效增强设计的可维护性和复用性,可以避免不同模块间代码复制导致的不必要的错误.本文主要探讨task和function的使用以及两者之间的异同点. 1    task 定义不能出现在过程性语句快中,但是必须在"module-end"结构中. 格式一: 格式二: task可以没有或者有一个或多个参数,值通过参数传入和传出task.输入输出在任务开始处声明,且输入与输出

RTL基本知识:线网的隐性声明

线网(net)作为Verilog语言中两种主要数据类型之一(变量数据类型和线网数据类型),主要用来模拟数字设计中连接多个不同模块或者模型的物理连线,因此线网是不存储数据的(除了trireg类型),仿真时线网上显示的数据由驱动该线网的驱动源决定的.如果线网没有被有效驱动,那么其上表现出来的数据是高阻态(除了trireg).同时同一个模块中不允许对同一个线网进行多次声明. 在仿真验证的过程中经常会遇到未声明的标识符在仿真过程中有时会报出错误信息或者警告信息,但是有时又不会出现任何信息,那么在什么情况

RTL基本知识:转义名的前世今生

在Verilog中,标识符是大小写敏感的(参考之前大小写topic),标识符的长度一般不要太长,尽量遵守相关的编码规范,达到名副其实即可.通常标识符一般分为以下两种: 简单标识符(simple identifier): 转义标识符(escaped identifier): 1.简单标识符 在Verilog中简单标识符一般由字母.数字.下划线和$组成,第一个字符不能是数字或者$,但可以是字母或者下划线,并且不能与Verilog中的关键字相同(建议与其他硬件设计验证语言中的关键字也进行区别). [示

RTL基本知识:使用枚举类型表示状态机进入死循环

在定义状态机中的状态时,除了可以使用宏(define)或者参数(parameter)声明定义外,还可以使用枚举类型,但是如果对于枚举类型使用不正确的话,极易出现编译仿真均没有报错,但是仿真时状态机跳转异常的情况.本文将针对这种情况进行示例说明并给出解决方法. 1  数据类型 在Verilog中所有的变量和线网都是4值数据类型,但在SystemVerilog中,对信号类型和数据类型进行了详细的区分,其中信号类型保持与Verilog一样,主要分为变量和线网类型,但是数据类型分为了2值类型(0和1)和