systemverilog绿皮书随记(八)-- 功能覆盖率

news2024/9/19 10:50:57

代码覆盖率: 

  1. 路径覆盖率:在穿过代码和表达式的路径中有哪些已经被执行过
  2. 行覆盖率: 源代码中每一行代码是否被执行至少一次
  3. 翻转覆盖率:哪些单比特变量的值为0或1
  4. 有限状态机覆盖率:状态机中哪些状态和状态转换已经被访问过

语句覆盖率不仅包括行覆盖率,还可能包括条件语句中的多个分支

断言覆盖率:测试中被触发的断言数量与总断言数量的比例

功能覆盖率:

验证计划中应该弄清楚相关设计的关键特性、边界情形和可能的故障模式;计划应该把有影响的设计状态描述清楚;

覆盖组的触发:

一般情况下,覆盖组都要进行明确的实例化才可以开始采样;如果覆盖组定义在类里,实例化时使用最初的名字即可,不用另外起名字;

使用sample()函数触发覆盖组;

使用事件触发的覆盖组

使用断言进行触发

例9.9 带SystemVerilog断言的模块
module mem(simple_bus sb):
  bit [7:0] data, addr;
  event write_event;
  cover property
    (@(posedge sb.clock) sb.write_ena == 1)
    -> write_event;
endmodule

例9.10 使用SVA触发覆盖组
program automatic test(simple_bus sb);
  covergroup Write_cg @(sroot.top.ml.write_event);
    coverpoint sroot.top.ml.data;
    coverpoint sroot.top.ml.addr;
  endgroup: Write_cg
  initial begin
    Write_cg = new();
  end
endprogram

默认自动建仓64

{option.auto_bin_max= ;}在覆盖点内使用则是规定这个覆盖点

option.auto_bin_max= ;在覆盖组内使用则是规定这个覆盖组内的所有覆盖点

option.auto_bin_max对枚举类型没用

自定义覆盖点的仓

covergroup CovKind;
  coverpoint tr.kind(
    bins zero = {0};    // 1个仓代表kind=0
    bins 10_3_5 = {[1:3], 5};  // 1个仓代表1到3和5的值
    bins hi[] = {[8:$]};     // 8个独立的仓:8到15
    bins misc = default;       // 1个仓代表剩余的所有值
  )              // 没有分号
endgroup      // CovKind

运用iff和start()和stop()控制覆盖组

例9.20 条件覆盖 - 复位期间禁止
covergroup CoverPort;
  // 当reset_a=1时不要收集覆盖率数据
  coverpoint port iff(!bus_if.reset);
endgroup

同样地,你也可以使用start和stop函数来控制覆盖组里各个独立的实例。

例9.21 使用start和stop函数
initial begin
  CovPort ck = new();
  // 实例化覆盖组
  // 复位期间停止收集覆盖率数据
  #1ns ck.stop();
  bus_if.reset = 1;
  #100ns bus_if.reset = 0;  // 复位结束
  ck.start();
  ...
end

对于枚举类型,SV会为每一个可能得值创建一个仓;如果想多个数值放到单个仓里,那就必须自己定义仓;

翻转覆盖率:

例9.24 确定覆盖点的翻转次数
covergroup CoverPort;
  coverpoint porti
    bins t1 = (0 => 1), (0 => 2), (0 => 3);
endgroup
使用范围表达式可以快速地确定多个转换过程。表达式[1, 2 => 3, 4]创建了四个转换过程,分别是(1 => 3)、(1 => 4)、(2 => 3)和(2 => 4)。
还可以确定任何长度的翻转次数。注意必须对转换过程中的每个状态都进行一次采样。所以(0 => 1 => 2)不同于(0 => 1 => 1 => 2)和(0 => 1 => 1 => 1 => 2)。如果你需要像最后一个式子那样重复数值,可以使用缩略形式:from:(0=>1[*3]=>2)。如果需要对数值1进行3次、4次或5次重复,那么使用1[*3:5]。

使用关键字wildcard定义bins 在表达式中任何X、Z或?都会被当成0或1的通配符

可以使用igonre_bins来排除掉那些不用来计算功能覆盖率的值;

使用illegal_bins可以捕捉到错误检查程序遗漏掉的状态;同时如果出现不合法的数值,程序会出现报错;

交叉覆盖率:

covergroup CovPortKind;
  port: coverpoint tr.port 
  {
    bins port[] = {[0:$]};
  }
  kind: coverpoint tr.kind 
{
    bins zero = (0);            // 1个仓代表kind=0
    bins ten = ([1:3]);        // 一个仓代表1到3的值
    bins hi[] = {[8:$]};        // 8个独立的仓
    bins misc = default;        // 1个仓代表剩余的所有值
  }
  cross kind, port;
endgroup: CovPortKind

在交叉覆盖中排除掉部分bin

cross kind, port {
  ignore_bins hi = binsof(kind) intersect {[7]};
  ignore_bins md = binsof(port) intersect { 0 } &&
                   binsof(kind) intersect {[9:11]};
  ignore_bins lo = binsof(kind.lo);
}
endgroup

使用option.weight指明覆盖率的权重

例9.34指明交叉覆盖率的权重
covergroup CovPort :
  kind: coverpoint tr.kind 
{
    bins zero = {0};
    bins lo = {[1:3]};
    bins hi[] = {[8:$]};
    bins misc = default;
    option.weight = 5; // 在总体中所占的分量
  }
  port: coverpoint tr.port 
{
    bins port[] = {[0:$]};
    option.weight = 0; // 在总体中不占任何分量
  }
  cross kind, port 
    {option.weight = 10;} // 给予交叉更高的权重
endgroup: CovPort



ab: cross a, b {
  bins a0b0 = binsof(a.a0) && binsof(b.b0);
  bins a1b0 = binsof(a.al) && binsof(b.b0);
  bins bl = binsof(b.bl);
}

ab: cross a, b {
  bins a0b0 = binsof(a) intersect (0) &&
               binsof(b) intersect (0);
  bins a1b0 = binsof(a) intersect (1) &&
               binsof(b) intersect (0);
  bins bl = binsof(b) intersect (1);
}

覆盖组选项:

单个实例覆盖率:

如果一个覆盖组被实例化多次,那么缺省情况下,sv会把所有实例的覆盖率整合到一起;

想要查看单个实例的覆盖率,可以在覆盖组中使用option.pre_instancen = 1 ;

pre.instance只能用于覆盖组,不能用于覆盖点或交叉点;

注释:

option.comment = “”;为覆盖组增加注释字符串;(在使用pre_instance的前提下使用);

type_option.comment(当覆盖组只例化了一次时使用,若要为多个实例进行单独注释,要使用pre_instance)

覆盖阈值:

option.at_least

如果定义在覆盖组,那么作用于所有覆盖点;若定义于点内,只对该点有效;

打印空仓:

Option.cross_num_print_missing=  ;

constraint块变量处理顺序:

solve ...before

获得覆盖率:

get_coverage()和get_inst_coverage()

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

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

相关文章

Think | 大模型迈向AGI的探索和对齐

注:节选自我于24年初所写的「融合RL与LLM思想探寻世界模型以迈向AGI」散文式风格文章,感兴趣的小伙伴儿可以访问我的主页置顶或专栏收录,并制作了电子书供大家参考,有需要的小伙伴可以关注私信我,因为属于技术散文风格…

NVDLA专题2:具体模块介绍——Bridge DMA

对于NVDLA,输入图像和处理结果存储在外部DRAM中,但外部DRAM带宽和延迟通常不足以让NVDLA充分利用其MAC阵列。因此,NVDLA给片内SRAM配置了第二个存储器接口。 为了利用片内SRAM,NVDLA需要在外部DRAM和SRAM之间移动数据。Bridge DM…

Ubuntu20.04 运行深蓝路径规划hw1

前言 环境: ubuntu 20.04 ; ROS版本: noetic; 问题 1、出现PCL报错:#error PCL requires C14 or above catkin_make 编译时,出现如下错误 解决: 在grid_path_searcher文件夹下面的CMakeLis…

若依导出自定义数据处理器

我在编写导出的时候,由于若依的Excel注解基本功能不满足我的需求 比如说我想导出这种样式,30和31天导出时全勤,其他天数显示原本天数 遂了解若依自定义数据处理器 1.首先来到实体类 给注解加上handler和args /** 出勤情况 */Excel(name &…

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好,我是Stark-C~ 作为一个喜欢折腾的数码党,我平时上网冲浪使用的浏览器绝不会只限于一种,就比如说我在上班的地方只会用到Edge浏…

项目管理者必读:全生命周期系统选择技巧

国内外主流的10款国外项目管理软件对比:PingCode、Worktile、Trello、Monday.com、ClickUp、Jira、Asana、Tapd、Tower、Teambition。 在管理复杂项目时,选对工具是成功的关键。全生命周期项目管理系统不仅可以帮助你保持项目的进度和预算控制&#xff0…

Windows10配置FFmpeg和使用FFmpeg截取视频流视频

第一部分:Windows10配置FFmpeg 简介:FFmpeg是一个功能强大的多媒体处理工具(用于录制、转换和播放音频和视频)。可以进行转换、剪辑、拼接、过滤等操作。 1、下载FFmpeg工具(分Windows和Linux其他) Download FFmpeghttps://ffm…

【MySQL】执行DDL选择Online DDL还是PT-OSC?

目录 1.前言2.Online DDL和PT-OSC原理、执行机制以及优缺点2.1.Online DDL2.2.PT-OSC 3.各种常用DDL操作如何选择 1.前言 MySQL DDL(Data Definition Language)表结构变更,主要支持Online DDL和PT-OSC模式,但是即使知道两者的工作…

谷粒商城实战笔记-173~174-商城业务-检索服务-搭建页面环境-调整页面

文章目录 一,173-商城业务-检索服务-搭建页面环境1,引入thymeleaf2,search模块导入模板页面3,配置域名4,上传静态资源到nginx的html目录5,nginx配置5.1 域名监听配置5.2 静态资源静态配置 6,sea…

Altium Designer 18原理图器件自动标号

前言: 当我们绘制原理图时,元器件的位号是不会自动生成的,位号大都是乱的,造成出图时十分不和谐。 器件位号修改 第一种方法: 可以先修改一个器件位号,按住shift 键然后再拖动器件会生成一个新的&…

Python面试宝典第33题:电话号码的字母组合

题目 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合,答案可以按任意顺序返回。给出数字到字母的映射如下图(与手机按键相同)。注意:1不对应任何字母。 示例 1: 输入:digits &quo…

【网络】IP的路径选择——路由控制

目录 路由控制表 默认路由 主机路由 本地环回地址 路由控制表的聚合 网络分层 个人主页:东洛的克莱斯韦克-CSDN博客 路由控制表 在数据通信中,IP地址作为网络层的标识,用于指定数据包的目标位置。然而,仅有IP地址并不足以确…

Linux 进程间通信之管道

个人主页:仍有未知等待探索-CSDN博客 专题分栏: Linux 目录 一、通信 1、进程为什么要通信? 1.数据的类型 2.父进程和子进程算通信吗? 2、进程如何通信? 3、进程通信的常见方式? 二、管道 1、概念…

SpringBoot中整合Mybatis

一、Mybatis快速入门 1.1、在相应的模块中添加依赖的坐标 首先创建一个maven项目 在对应的pom.xml文件中引入下面的依赖 <dependencies><!--mybatis 依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artif…

【已解决】如何解决雅马哈机械手无法连接到在线模式的问题

前言 在一个项目中用到了雅马哈机器手&#xff0c;但是现场操作的时候进场出现连接不上的问题&#xff0c;经过与官方技术讨论得出以下的解决方法。 解决方法 避免这个问题出现在操作完之后必须将机械手控制器切换成离线模式。主要原因&#xff1a;1、机械手控制器本身是属…

什么是知识中台?如何搭建企业知识中台?(企业必懂术语)

一、什么是知识中台&#xff1f; 知识中台是一个集中管理、整合和共享企业知识资源的平台。它利用云计算、大数据和人工智能等技术&#xff0c;将企业内部各部门、各员工手中的知识资源进行集中整合&#xff0c;形成统一的知识库。通过这个平台&#xff0c;员工可以快速查找、…

BGP边界网关协议基础详细

1.BGP概述 1.1 BGP基础 应用层协议&#xff0c;基于TCP&#xff0c;源端口号是随机&#xff0c;目的端口是179。 无类路由协议、外部网关路由协议、采用距离(路径)矢量算法、单播路由协议 核心作用为传递路由。 1.2 AS自治系统 AS是指由同一个技术管理机构管理&#xff0…

数据可视化:解锁数据奥秘的钥匙与实战指南

如何有效地解读和利用这些数据成为了企业和个人面临的重大挑战。数据可视化&#xff0c;作为连接数据与洞察的桥梁&#xff0c;正逐步成为数据分析与决策支持不可或缺的工具。本文将深入探讨数据可视化的本质、用途分类、设计原则、高效制作技巧&#xff0c;并通过Axure产品设计…

四数相加2 | LeetCode-454 | 哈希集合 | Java详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️思路&#xff1a;四数相加 > 两数相加 &#x1f4cc;LeetCode链接&#xff1a;454. 四数相加 II 文章目录 1.题目描述&#x1f34e;2.题解&#x…

事件驱动系统设计之将事件检索与事件处理解耦

0 前言 part1讨论了集成过程中遇到的挑战以及幂等事件处理的作用。解决集成问题之后&#xff0c;我们需要反思事件检索的问题。我们的经验教训表明&#xff0c;将事件检索与事件处理解耦至关重要。 1 事件处理与请求/响应 API 紧耦合 part1讨论了将请求/响应 API 集成到事件…