【VCS】(6)Code Coverage

news2024/12/23 10:16:04

Code Coverage

  • VCS 中 Code Coverage 的类型
  • Code Coverage Flow
  • 代码覆盖率选项
  • Lab Code Coverage
    • 初步尝试
    • 其他格式的覆盖率报告
    • 屏蔽部分代码
    • 屏蔽整个模块

设计和验证到底要做到什么程度? 这里其中一个指标就是 Code Coverage。

代码覆盖率一般考虑以下几个方面:

RTL代码的每一行都执行了吗? 行覆盖率,一般要求为 100%。否则可能为冗余,造成面积浪费。

状态机的每一个状态都用到了吗?

分支语句的每一个分支( if 、case 等)都仿真到了吗?

功能覆盖率:

是否覆盖了所有的功能?(所有可能的指令组合是否都被验证到?)

设计的边界(corner cases)是否被测试到?(一些比较特殊的使用场景,设计时可能没有考虑到的使用场景)

VCS 中 Code Coverage 的类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 正常信号都是由跳变的,不跳变可能会存在问题
  2. 对于 Verilog 而言,主要对 Register、Wires、Memories进行检查,其中对 Memories 的检查需要在编译的时候添加 +memcbk 选项。
  3. 耗时

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于没有覆盖到条件,是漏掉了,还是因为是一种不可能出现的场景。

在这里插入图片描述
每一条分支语句,就代表的是一条路径。

不同的抽象层级对应的代码覆盖率:

在这里插入图片描述

Code Coverage Flow

在这里插入图片描述
(当前一般不会用 -cm_pp 命令来查看波形,一般用的是DVE。)

RTL源代码中会有一些内容是用于调试等其他作用的,希望在计算 RTL 代码覆盖率的不考虑该部分内容,这个时候是需要告诉工具不去分析这一部分内容的,如果不做说明,工具会考虑在内。

在Verilog中,可以使用如下注释来告诉VCS工具那一部分内容在计算覆盖率的时候不考虑在内,

// VCS coverage on
// VCS coverage off

Synopsys公司还提供了一种特殊的注释,如下:

// synopsys translate_on
// synopsys translate_off

这个注释是 Synopsys 的可以识别的,注释包含的那一部分内容在逻辑综合的时候是不考虑的(比如RTL代码中的 display 语句。)。该注释选项,同时也可以关闭对该部分内容的覆盖率计算。

上面的注释只是针对某些特殊的代码段进行屏蔽,如果在编译或者报告的时候(compile time/report time)使用 -cm_hier <name_of _file>是可以实现对任何实例、模块、文件等进行屏蔽。

代码覆盖率选项

(主要关注红色部分)
在这里插入图片描述
使用 -cm_dir e可以指定输出的覆盖路数据保存的路径,默认情况的的覆盖率文件的后缀名是 .vdb

在这里插入图片描述
在这里插入图片描述
(一般情况下, case 语句的 default 是不会执行到的,所以是可以在计算覆盖率的时候忽略该语句的,通过-cm_nocasedef实现)

在这里插入图片描述
(方法②就是使用 -o 选项得到不同 testbench 对应得仿真可执行文件,然后分别执行这些仿真之后,将覆盖率数据合并。这是使用最多得方法)

不同的测试用例对代码覆盖率的贡献程度是不同的,使用 Autograding 功能就可以得到不同测试用例对覆盖率得贡献情况。

在这里插入图片描述

Lab Code Coverage

这里使用的还是fsm的例子。

初步尝试

Makefile文件内容如下:

.PHONY: com cov clean debug

OUTPUT = simv_fsm_moore
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

#vdp file name
VPD_NAME = +vpdfile+$(OUTPUT).vpd

# Compile command
VCS = vcs -sverilog +v2k -timescale=1ns/1ns	\
	-simprofile				\
	-debug_acc+all			\
	+notimingcheck			\
	+nospecify				\
	+vcs+flush+all			\
	$(CM)					\
	$(CM_NAME)				\
	$(CM_DIR)				\
	$(ALL_DEFINE)			\
	$(VPD_NAME)				\
	-o $(OUTPUT)			\
	-l compile.log

# Simulation command
SIM = ./$(OUTPUT)				\
	$(CM) $(CM_NAME) $(CM_DIR)	\
	$(VPD_NAME)					\
	-l $(OUTPUT).log

# Start Compile
com:
	$(VCS) -f file_list

# Start simulation
sim:
	$(SIM)

# Show the Coverage
cov:
	dve -covdir *.vdb &
	
debug:
	dve -vpd $(OUTPUT).vpd &

# Start Clean
clean:
	rm -rf ./csrc *.daidir *.log *.vpd *.vdb simv* *.key *race.out* 	\
			*profileReport* *simprofile*								\

编译仿真:
在这里插入图片描述

仿真之后产生的文件内容:

在这里插入图片描述

覆盖率查看:

在这里插入图片描述

打开之后的界面如下:

在这里插入图片描述

点击某一种类型的代码覆盖率,进图如下界面,代码会有高亮显示。

在这里插入图片描述

Toggle 覆盖率:
在这里插入图片描述

FSM 覆盖率:

在这里插入图片描述

分支覆盖率:

在这里插入图片描述

其他格式的覆盖率报告

除了通过DVE查看覆盖率报告之外,还可以通过其他形式。
在 DVE 界面,File >> Generate URG … 选项可以生成网页格式的覆盖率报告文件。
也可以在输入命令生成:
在这里插入图片描述
两者是一样的,都会得到一个 urgReport 文件夹,该文件夹的内容如下:
在这里插入图片描述

其中一个文件的内容如下:

在这里插入图片描述
这些文件在Window下也可以查看,而且还可以点击进行点击操作,非常便于交流。

屏蔽部分代码

如下图所示,
在这里插入图片描述
现在如何让 display 语句不在覆盖率的计算范围之内呢?

方法一:使用 VCS coverage on/off 注释

在这里插入图片描述

在这里插入图片描述

方法二:使用 synopsys translate_on/off 注释

在这里插入图片描述
(这里注意看,注释的颜色都变了,其实是工具可以识别的关键字)

VCS coverage on/off只有不统计覆盖率的功能,该开关主要是在逻辑综合的时候告诉DC工具不综合,同时也具有不计算代码覆盖率的功能。
在这里插入图片描述

屏蔽整个模块

当前的覆盖率计算是包含两个模块的,如下:
在这里插入图片描述

如何只计算 DUT 的代码覆盖率,而不计算 testbench 的代码覆盖率?

① 新建一个文件,在文件中放入如下内容:

在这里插入图片描述

② 在编译命令中添加如下选项:

在这里插入图片描述

这样得到的覆盖率计算情况如下:

在这里插入图片描述

如果是想要只计算某一个模块的覆盖率,就是把 vcs_cov.cfg 中的内容修改为:+module fsm_top
类似的还有如下命令:

+tree fsm_top.fsm_moore:只查看 fsm_top 模块中的 fsm_moore 模块
+file fsm_top.v:整个文件内容都不看

类似的还有很多, 可以在文档里面查看。+是查看,-是不查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前置操作符和后置操作符

下面的代码有没有区别&#xff1f;为什么&#xff1f; 意想不到的事实 现代编译器产品会对代码进行优化 优化使得最终的二进制程序更加高效 优化后的二进制程序丢失了 C/C 的原生语义 不可能从编译后的二进制程序还原 C/C 程序 思考 操作符可以重载吗&#xff1f; 如何区分…

V1.4基站仓储三代标签操作指导

一、管理系统使用 1、启动v1.4基站 插上电源&#xff0c;用网线连接基站和电脑。基站默认ip为192.168.1.200&#xff0c;所以需要修改电脑的IP地址为192.168.1.x&#xff0c;例如&#xff1a;192.168.1.100 ​ 注&#xff1a;当基站第二个灯&#xff08;绿色&#xff09;闪烁…

DAY12_JSPEL表达式JSTL标签MVC模式和三层架构

目录 1 JSP 概述2 JSP 快速入门2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试 3 JSP 原理4 JSP 脚本4.1 JSP 脚本分类4.2 案例4.2.1 需求4.2.2 实现4.2.3 成品代码4.2.4 测试 4.3 JSP 缺点 5 EL 表达式5.1 概述5.2 代码演示5.3 域对象 6 JSTL标签6.1 概…

leetcode数据结构题解(Java实现)(存在重复元素、最大子数组和、两数之和、合并两个有序数组)

文章目录 第一天217. 存在重复元素53.最大子数组和 第二天1. 两数之和88. 合并两个有序数组 第一天 217. 存在重复元素 题解思路&#xff1a;首先题目需要的是判断数组中是否存在相同的数字&#xff0c;存在返回true,不存在就返回false。 那么显然可以这样做&#xff0c;先进行…

全光谱护眼灯怎么选择?护眼灯全光谱和自然光谱的区别

一、全光谱护眼台灯的挑选技巧 全光谱&#xff1a;想要护眼台灯能有自然光的效果&#xff0c;选择台灯时建议选择全光谱台灯&#xff0c;并且显色指数大于Ra95以上的&#xff0c;显色指数越高越还原色彩&#xff0c;并且选择RGO豁免蓝光才是真的不会伤害眼睛的。 照射面积&…

Python(四十)for-in练习题——100到999之间的水仙花数

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

2023年发布的25个开源大型语言模型总结

大型语言模型(llm)是一种人工智能(AI)&#xff0c;在大量文本和代码数据集上进行训练。它们可以用于各种任务&#xff0c;包括生成文本、翻译语言和编写不同类型的创意内容。 今年开始&#xff0c;人们对开源LLM越来越感兴趣。这些模型是在开源许可下发布的&#xff0c;这意味…

Redis Stream 流的深度解析与实现高级消息队列【一万字】

详细介绍了 Redis 5.0 版本新增加的数据结构Stream的使用方式以及原理&#xff0c;如何实现更加可靠的消息队列。 文章目录 Stream 概述2 Stream基本结构3 存储数据3.1 Entry ID3.2 数量限制 4 获取数据4.1 范围查询4.2 独立消费消息4.2.1 非阻塞使用4.2.2 阻塞的使用 4.3 消费…

【Spring定时器】SpringBoot整合Quartz

SpringBoot整合Quartz 简单介绍 简单操作 导入相关pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>创建继承类MyQuartz package com.ustc.quartz; …

C语言假期作业 DAY 01

题目 1.选择题 1、执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09; int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y)…

Docker 单机/集群 部署 Nacos2.2.0

单机部署 1- 拉取镜像 docker pull nacos/nacos-server:v2.2.02- 准备挂载的配置文件目录和日志目录 日志目录(空目录)&#xff1a;./nacos/logs配置文件&#xff1a;./nacos/conf/application.properties 从官网下载 nacos 压缩包&#xff1a;Release 2.2.0 (Dec 14, 2022…

基于SpringBoot+vue的医院信管系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

TypeScript -- 基础类型

文章目录 TypeScript -- 基础类型let 和 const基本类型写法布尔类型 -- boolean数字类型 -- number字符串类型 -- string数组类型元组类型枚举类型 -- enum任意类型 -- any空值 -- voidNull 和 Undefined不存在的类型 -- never对象 -- object类型断言 TypeScript – 基础类型 1…

关于 ivanti Access Client软件配置问题

最近需要使用ivanti工具连接校园网&#xff0c;但是经常出现ivanti连接后&#xff0c;WIFI或有线网络就显示无互联网连接的情况。 为此&#xff0c;我检查了一下网络的配置状态&#xff0c;发现ivanti连接的时候回临时创建一个网络adapter&#xff0c;该adapter有 一个身份验证…

Java训练二

一、斐波那契数列 1、1、2、3、5、8、13、21、34、...是一组典型的斐波那契数列&#xff0c;前两个数相加等于第三个数。那么请问这组数中的第n个数的值是多少&#xff1f; package haha; import java.util.Scanner; public class helloworld{public static void main(String…

Python基础语法第四章之函数

目录 一、函数 1.1函数是什么 1.2语法格式 1.3函数参数 1.4函数返回值 1.5变量作用域 1.5.1变量只能在所在的函数内部生效. 1.5.2 在不同的作用域中, 允许存在同名的变量 1.5.3如果函数内部尝试访问的变量在局部不存在, 就会尝试去全局作用域中查找 1.5.4如果是想在函数…

头戴式玩具外贸出口EN71检测报告需要什么资料?

EN71是欧盟市场玩具类产品的规范标准。儿童是全社会最关心和爱护的群体&#xff0c;儿童普遍喜爱的玩具市场发展迅猛&#xff0c;同时各类玩具由于各方面质量问题给儿童带来的伤害也时有发生&#xff0c;因此世界各国对本国市场上的玩具的要求正日益变得严格。许多国家都就这些…

【C语言day06】

逻辑或运算如果前表达式为真&#xff0c;后表达式不计算&#xff0c;第一次循环时i为0&#xff0c;执行i&#xff0c;第二次循环时i为1&#xff0c;是个真值&#xff0c;不再执行i&#xff0c;也就死循环了 在C语言中&#xff0c;一个函数如果不写返回值类型&#xff0c;那么就…

2023年深圳杯数学建模B题电子资源版权保护问题

2023年深圳杯数学建模 B题 电子资源版权保护问题 原题再现&#xff1a; 版权又称著作权&#xff0c;包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人…

【Element-ui】学习与使用

网站快速成型工具Element&#xff0c;一套为开发者、设计师和产品经理准备的基于vue2.0的桌面端组件库 安装 npm i element-ui -S 在项目中安装element-ui&#xff0c;安装了以后查看package.json中的依赖中有没有element-ui的版本&#xff0c;如果有&#xff0c;则说明安装成功…