VCS
编译型verilog仿真器,先将.v文件转化为C文件,在linux下编译生成可执行文件,运行simv得到仿真结果
在实际工程中,通常使用VCS生成fsdb格式的波形文件,将其导入Verdi查看波形,代替DVE进行联合仿真。
在tb文件加入$vcdpluson(); --在仿真结束后会生成vcdplus.vpd文件,这个文件记录仿真过程所有信号的波形,可以使用DVE打开。
补充:1.+define+DUMP_VPD表示在编译时定义 DUMP_VPD 这个宏
2.在编译时,使用 +vpdfile+filename 可以更改生成 VPD 文件的文件名,默认为 vpdplus.vpd。
3.调用 $vcdpluson() 时可以加入一些参数,如果什么都不加,则默认记录顶层模块下所有子模块的信号波形。参数格式:$vcdpluson(level_number, module_instance, ... , ... )。比较重要的参数为前两个。数字设计里面的 module 是层次化/结构化的,类似于一层一层的黑盒子不断包含下去。module_instance 表示从哪一个module开始记录波形,level_number表示查看 module_instance 下子模块多少层的波形。下面使用一些例子来说明。
$vcdpluson() 或者 $vcdpluson(0, addertb) 记录 addertb 及其所有子模块的波形。
$vcdpluson(1, addertb) 只记录 addertb 层的波形。
$vcdpluson(2, addertb) 记录 addertb 层和 u1(add8) 层的波形。
$vcdpluson(3, addertb) 记录 addertb , u1(add8) ,u1(add4),low_add, high_add 层的波形。
仿真覆盖率的问题
在进行功能验证时,给设计添加激励信号,查看仿真结果,需要考虑覆盖率的问题。覆盖率分为代码覆盖率(code coverage)和功能覆盖率(function coverage)。功能覆盖率就是检查设计的功能是否完善,需要考虑很多不同的情况,是使用System verilog的重点内容。代码覆盖率是检查代码是否存在冗余,检查所有的代码是否都已经执行,状态机所有的状态是否都有到达,检查 if else 和 case 条件语句的条件是否都有使用。防止一些不必要的代码浪费芯片面积,我们这里只讨论代码覆盖率。
Line coverage :行覆盖率,检查语句是否被执行。
Toggle coverage:检查电路的每个节点是否都有 0 -> 1 和 1 -> 0 的跳变。这种检查通常会使仿真变慢很多。
conditional coverage:检查条件语句是否覆盖了所有的情况。 比如有时写了if 语句,没有写else语句。
FSM coverage: 状态机覆盖率,检查状态机所有的状态是否都到达过。
path coverage:在always语句块和initial语句块中,有时会使用 if ... else 和 case 语句,在电路结构上便会产生一系列的数据路径。检查这些路径的覆盖情况。
VCS在统计代码覆盖率的过程中,我们通常在编译和仿真命令上添加对应的开关选项,生成一个 .vdb文件记录覆盖率的情况。再使用dve打开该文件查看。下面介绍一些选项。
1. -cm <coveragetype> :打开对应类型的覆盖率,例如 -cm cond+tgl+lin+fsm+path为统计上述所有覆盖率。可根据需要增减。
2. -cm_name:设置记录有覆盖率信息文件的名字。
3. -cm_dir:指定生成文件的目录。
以上三个选项编译仿真过程都要加上。下面的选项在编译过程加上。
-cm_log + filename.log:.log文件记录仿真过程中统计覆盖率的信息。用的比较少。
-cm_nocasedef: 在统计case语句的条件覆盖率时,不考虑default条件未达到的情况。
-cm_hier vcs_cov.cfg:通过.cfg文件(名字随便取)选择要查看覆盖率的模块/文件。
+”代表查看,“-”代表不查看。tree代表查看某个模块调用的子模块。
在文件内部,可以使用特殊注释来打开和关闭代码覆盖率的统计:
//VCS coverage on 统计代码覆盖率
.......
//VCS coverage off 不统计代码覆盖率
在上述注释之间的内容,统计覆盖率。其余地方不统计。
VCS编译选项
-Muldate 增量编译 代码量很大,只是修改一小部分时候,不需要重新编译,做增量编译,与原来的代码进行衔接,节约时间
-R 自动执行simv 自动执行编译后的可执行文件 .simv
-o filename 默认生成的可执行文件是 simv,可以通过这个指令输出指定的文件名 如:filename (可以忽略,没什么用)
-gui 启动dev界面(写的Makefile 里边有相应启动操作,无需注意)
-l readme.log 编译过程中会产生包含warning等信息的文件,将其输出到readme.log中
-v lib_file 如果用到了某些厂商的工艺库,到这个工艺库文件中寻找
-y lib_dir 指定寻找工艺库文件的目录
+libext+lib_rxt 如果用到很多工艺库,通过指定的文件后缀lib_ext(指定后缀),来寻找指定目录下的指定后缀文件
+incdir+./inc_dir.h search inc_dir directory for ‘include files’有时候,我们需要用到头文件,特别是在ifdef语法中。在tb文件中添加头文件,需要再编译的时候加上+incdir+./inc_dir.h 否则会提示找不到头文件。
+define+宏的名字 直接在命令里面定义宏
芯王国示例工程
创建一个存储文件路径的文件,方便Makefile使用,如:filelist.f
在工程文件路径下,使用:find -name "*.v" >filelist.f
生成所有.v文件的路径
打开仿真文件,在里边加入生成.fsdb文件的语句
initial begin
$fsdbDumpfile("tb.fsdb");//产生名字为 tb.fsdb 的文件
$fsdbDumpvars;
end