VCS入门教程(三)
本文授权转发自知乎用户 橘子汽水 链接:https://www.zhihu.com/people/xing-qi-55-65/posts
一、前言
本文主要介绍使用VCS查看verilog代码覆盖率的相关问题。
二、代码覆盖率
1.在进行功能验证时,给设计添加激励信号,查看仿真结果,需要考虑覆盖率的问题。覆盖率分为代码覆盖率(code coverage)和功能覆盖率(function coverage)。功能覆盖率就是检查设计的功能是否完善,需要考虑很多不同的情况,是使用System verilog的重点内容。代码覆盖率是检查代码是否存在冗余,检查所有的代码是否都已经执行,状态机所有的状态是否都有到达,检查 if else 和 case 条件语句的条件是否都有使用。防止一些不必要的代码浪费芯片面积,毕竟面积就意味着钱。我们这里只讨论代码覆盖率。
对于我们写的RTL代码,通常考虑以下覆盖率:
Line coverage :行覆盖率,检查语句是否被执行。
Toggle coverage:检查电路的每个节点是否都有 0 -> 1 和 1 -> 0 的跳变。这种检查通常会使仿真变慢很多。
conditional coverage:检查条件语句是否覆盖了所有的情况。比如有时写了if 语句,没有写else语句。
FSM coverage: 状态机覆盖率,检查状态机所有的状态是否都到达过。
path coverage:在always语句块和initial语句块中,有时会使用 if ... else 和 case 语句,在电路结构上便会产生一系列的数据路径。检查这些路径的覆盖情况。
2.VCS在统计代码覆盖率的过程中,我们通常在编译和仿真命令上添加对应的开关选项,生成一个 .vdb文件记录覆盖率的情况。再使用dve打开该文件查看。下面介绍一些选项。
-cm <coveragetype> :打开对应类型的覆盖率,例如 -cm cond+tgl+lin+fsm+path为统计上述所有覆盖率。可根据需要增减。
-cm_name:设置记录有覆盖率信息文件的名字。
-cm_dir:指定生成文件的目录。
以上三个选项编译仿真过程都要加上。下面的选项在编译过程加上。
-cm_log + filename.log:.log文件记录仿真过程中统计覆盖率的信息。用的比较少。
-cm_nocasedef: 在统计case语句的条件覆盖率时,不考虑default条件未达到的情况。
-cm_hier vcs_cov.cfg:通过.cfg文件(名字随便取)选择要查看覆盖率的模块/文件。
图 1
“+”代表查看,“-”代表不查看。tree代表查看某个模块调用的子模块。
在文件内部,可以使用特殊注释来打开和关闭代码覆盖率的统计:
//VCS coverage on 统计代码覆盖率
.......
//VCS coverage off 不统计代码覆盖率
在上述注释之间的内容,统计覆盖率。其余地方不统计。
3.
修改VCS入门教程(二)中的makefile,新增统计代码覆盖率的内容
.PHONY:com sim debug cov clean
OUTPUT = cov_test
ALL_DEFINE = +define+DUMP_VPD
#code coverage command
CM = -cm line+cond+fsm+branch+tgl
CM_NAME = -cm_name ${OUTPUT}
CM_DIR = -cm_dir ./${OUTPUT}.vdb
VPD_NAME = +vpdfile+${OUTPUT}.vpd
VCS = vcs -sverilog +v2k -timescale=1ns/1ns
-o ${OUTPUT}
-l compile.log
${VPD_NAME}
${ALL_DEFINE}
${CM}
${CM_NAME}
${CM_DIR}
-debug_pp
-Mupdate
SIM = ./${OUTPUT} ${VPD_NAME}
${CM}
${CM_NAME}
${CM_DIR}
-l ${OUTPUT}.log
com:
${VCS} -f filelist.f
sim:
${SIM}
#show the coverage
cov:
dve -covdir *.vdb &
debug:
dve -vpd ${OUTPUT}.vpd &
clean:
rm -rf ./csrc *.daidir *.log simv* *.key *.vpd ./DVEfiles ${OUTPUT} *.vdb
三、示例
设计一个选择器
图 2
在测试激励中,故意使 a = 1'b1 b = 1'b1 c = 1'b0 的情况不出现。使其覆盖率发生遗漏。
图 3
设计一个状态机
图 4
状态机存在 2'd0 -> 2'd1 的跳变,而 2'd1 -> 2'd0 的跳变没有发生过。
使用 make com 编译,make sim 仿真,make cov 查看代码覆盖率。make cov运行之后,dve界面打开的如下
图 5
单击箭头1处加号,再双击箭头2处的U1,查看设计的代码覆盖率。
图 6
行覆盖率,第25行未执行过。
图 7
Toggle coverage:大量节点都没有 0 -> 1 和 1 -> 0 两种跳变
图 8
FSM coverage :2'd1 -> 2'd0 的转换没有发生过。
condition 和 Branch(Path) 的覆盖率可自行查看。
四、结束语
本文主要介绍代码覆盖率的内容,对测试完整性来讲较为重要,通过一个小例子讲述了整个流程,具体使用时还要具体问题具体分析。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- main函数中的argc和argv到底是个啥?
- 传智播客OA项目学习--阶段一(2、框架整合)
- 微信XML消息model定义之微信公众平台(一)
- 自动返回笑话接口调用之微信公众平台(二)
- 「实战」 缘分使我们(骗子)相遇
- json-lib简单使用之微信公众平台(三)
- 小生归一(六)xss特殊绕过
- 最新绕过D盾注入方法分享(学姿势)
- 利用C#编写的绕过360安全卫士添加系统用户
- 小生归一(七)sprintf字符串格式化漏洞
- FastAdmin后台GetShell
- scRNA-seq Clustering
- Dizzy Blog
- LeetCode 392. 判断子序列
- LeetCode 5473. 灯泡开关 IV