SV知识点总结-覆盖率

覆盖率

1.覆盖率的类型

代码覆盖率:(1)跳转覆盖率(2)行覆盖率(3)分支覆盖率(4)条件覆盖率(5)状态机覆盖率;

断言覆盖率:(interface和module都可以做,但是不能在class做)

断言中的一些基本操作符号:(1)|->和|=>(2)##(3)[*n]和[=n],注意a[*0]的情况

(4)and/or/intersect/frist_match/througuht/within/if/ended:and/or:开始时间相同;满足时间可以不相同(以稍晚的为主);一个是同时满足,一个是只满足一个即可and/intersect:intersect要求同一时间开始同一时间结束,也就是周期数必须要一致,但是and仅仅是要求同一时间开始;and两侧仅仅是采样信号时,要求两侧都要满足and表示的语句才为高;ended:只关心结束,要结束或者已经结束

(5)局部变量和采样方法(需要放在sequence之后)

$rose/$fell/$stable/$past;

$countbits/$onehot/$isunknown/$countones;

$asserton/$assertoff/$assertkill;

property的使用(interface和module都可以做):

(1)assert/assume(作为环境的假设条件,一般用于形式验证,在动态仿真中一般不用)/cover,动态仿真中一般只用assert和cover

(2)时钟声明:两个时钟之间需要等待前一个时钟周期一拍;sequence中的and/or/intersect不可以用在多个时钟的sequence中,而property可以,因为后者表示逻辑运算,并不参与到sequence的时序关系中;时钟可以声明到sequence、property、时钟块(在时钟块clocking中声明property,则该property会继承时钟块的时钟)中,对于时钟的调用顺序是显示声明的时钟,环境中的时钟,默认的时钟;多个时钟时必须显示声明时钟,无法使用默认/继承的嵌套的时钟。

(3)绑定(绑定可以满足在设计外部定义断言,但是将其绑定到设计内部或者接口上):

interface range (input clk,enable,input int minval,expr);

  property crang_en;

    @(posedge clk) enable |-> (minval <= expr);

  endproperty

  range_chk:assert property(crang_en);

endinterface

bind cr_unit rang r1(c_clk,c_en,v_low,(in1&&in2));

这里的r1是interface的实例,c_clk,c_en,v_low,(in1&&in2)来自于模块cr_unit的端口信号及内部信号(in1和in2)。这种绑定类似于在tb中例化interface和dut(两者相似的地方在于这两者都需要例化接口),但是两者不同在于,对于tb的那种情况下对内部信号的访问需要通过句柄索引,而对于bind不需要索引,上面的语句中对于in1和in2是直接给信号的,但是需要注意的是,对于bind只能找到这个cr_unit的端口信号和内部这一层的信号,更深层次的嵌入信号同样找不到,而对于tb来说可以通过句柄索引找到深层次的信号;另外,需要注意的是,实际bind实际上是把interface放到了cr_unit内,而tb的情况下实际上interface例化的对象是在tb之下和DUT在同一个层次;对于tb来说,通过interface不仅仅可以检测信号还可以驱动信号,而对于bind来说只能起到检测信号的作用

(4)expect:阻塞的,用法类似于assert,只能在task中使用。

功能覆盖率

一些其他的点:漏洞率曲线

2.覆盖组

定义:可以再类,interface,module,packge中定义,再类中定义一个或多个covergroup,彼此之间是是相互独立的,可以进行使能或禁止;先定义覆盖组,随后需要指明变量和数值:(1)covergroup coyport (定义覆盖组)(2)coverpoint tr.port (注意这里实际上是没有给coverponit名字,如果不给,系统会默认给一个,但建议给一个,其中tr.port是变量),如果加名字的化,采用的方式时xxcoverpoint tr.port (3)可以通过一些手段使得采样的数值为某些特定的数值,如果没有限定,那么默认是对对象中的所以数值采样randmode,randomize,constrain均可限定

例化:覆盖组与类相似,一次定义后就可以多次例化;例化方式:(1)covport = new() (2)covport cg1 = new()两种方式,其中第一种方式默认类型名称和实例名称相同,但只能例化一次不推荐,还是建议将类型名称和实例名称分开

触发(采样):

采样中需要注意的点:(1)覆盖组可以采集任何可见的变量,比如程序或模块的变量、接口信号、设计中的信号(软件中的也可以)(2)定义在类中的覆盖组可以采集类中的动态成员变量(3)对任何事务的采样必须等到待测事务接收到信号以后(4)covergroup的采样默认是对所以的coverpoint采样(4)covergroup中可以包含一个或多个coverpoint,全部都在同一时间采样(5)每个covergroup可以定义单独的触发采样事件,允许从多个源头收集数据;采样方式(covport =new()的采样为例):(1)显式:covport.sample(),调用sample函数,属于在声明时没有指定采样对象的方式(2)阻塞:@或wait();采用阻塞的方式可以实现使covergroup与其他对象同步,这种采样方式属于声明时指定采样事件,比如covergroup g2 @(posedge clk);coverpoint piex;endgroup(3)使用回调函数进行采样(4)使用事件触发进行采样(5)使用断言进行触发采样

方法:(1)sample()采样 (2)$getcoverage获取covergroup的加权覆盖率,coverport_inst.get_inst_coverage()获得单个实例的覆盖率,返回的都是0-100的数,表示百分比(3)xx.start()或xx.stop()使能或者关闭(4)set_inst_name(xx)对covergroup设定名称

3.数据采样

一些基本的点:(1)covergroup->coverpoint->cover bin, covergroup中可以定义多个coverpoint,coverpoint中可以自动定义多个coverbin,也可以借助SV自动定义多个coverbin  (2)定义bin时可以使用with进一步限定,比如coverpoint x {bins mod3 [] = { [0:255] } with (item % 3 == 0);} (3)如果采样变量的域范围过大,而又没有指定bin,那么系统会默认分配64个bin,将值域范围平均分配给这64个bin (4)用户可以通过covergroup的选项auto_bin_max来自动创建bin的最大个数,比如在covergroup内中采用语句 options.auto_bin_max=8; 表示group中所有 的point最大bin都是8,也可以在某一个point下面单独用{}将限定包住,指代这个coverpoint的最大bin数目 (5)如果coverpoint没有指代任何bin,那么SV会自动生成bin,遵循的准则是:如果变量是枚举类型,那么bin的数量就是枚举类型的基数;如果是整形,取2的M次幂(M是整形的位宽)与auton_bin_max的最小值(5)covergrouop中的参数可以传递到定义的bin中,但需要注意参数方向

条件覆盖率:iff既可以放在coverport中也可以放在coverpoint中。coverpoint port iff(!bus_if.reset)表示复位信号为0时才会采样,也可以采用stop或者start对对采样进行使能或者关闭(也就是采用ck.stop()或者ck.start()进行操作)

翻转覆盖率:(1)3 [* 5]表示3翻转五次,3 [* 3:5]表示3分别翻转3,4,5次;(2)3[=2]和3[->3]是一样的,均表示在翻转过程中翻转过2次或3次,彼此翻转之间可能是相邻的也可能是不相邻的;(3)1=>3[=2]=>6和1=>3[->2]=>6差别在于对6的翻转,前者表示3翻转后相邻或者不相邻均可以,而后者表示一定是相邻的,另外两者从1翻转到3时均表示可以相邻也可以不相邻

wildcard,ignore_bins,illegal_bins:在bin前加wildcard表示表达式中的?/x/z都会当成0或1,往往表示采样时不关心这些数;ignore_bins表示排除某些数值;illegal_bins表示碰到这些数值时仿真会报错,此时仿真会报错

交叉覆盖率:(1)可以通过binsof(),比如binsofa.a0),这里是针对变量a.a0这里是coverpoint要采样的变量,第二种方式是ignore_bins结合binsof(a) intersect(0)来排除不需要的crossbin,比如ignore_bins hi binsoft(port) intersect{7}  (2)上面的方法实际上是排除的方法,还可以通过选定特定的bin来交叉,此时有两种方式,第一种是在对coverponit声明的过程中就对每个值进行限定特定的名称,然后再用该名称进行cross,第二种是对coverponit声明的过程中不对每个值进行限定名称,而在cross过程中用binsoft() intersect()进行选定特定值进行cross(3)如果bin对某个变量的值域没有取尽,那么系统会自动的为没有取尽的值域的每一个值都创立一个bin

覆盖选项:(1)一个covergroup例化多次时,理论上是把所有例化的对象合并计算覆盖率,但是也可以单独针对某一个covergroup收集覆盖率,采用语句option.per_instance,单独的对某个coverpoint获得覆盖率(2)option.comment对covergroup进行注释,然后covergroup例化后可以传入字符串,便于代码阅读,采用语句option.comment=comment,其中第二个commnet是在定义covergroup时传入的参数,这样可以提高复用性(3)option.at_least最少采样次数,option.goal设定覆盖率,针对covergroup和coverpoint均可以

4.数据分析

$get_coverage()得到整体的覆盖率;covergroup_inst.get_inst_coverage()得到某个具体covergroup的覆盖率;

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SV (支持向量机) 是一种基于统计学习理论的机器学习算法,用于分类和回归分析。它的目标是找到一个超平面,将不同类别的样本分隔开来,并且使得超平面与最靠近它的样本间隔最大化。这种方法在处理高维数据集和处理非线性问题时非常有效。 “忽略翻转覆盖率”是SV的一种特定配置或策略,这意味着在构建分类器时忽略错误分类样本的数量,而只关注间隔的最大化。即使错误分类的样本数量增加,SV仍然致力于找到一个具有最大间隔的超平面。 忽略翻转覆盖率的优势主要是能够减少过度拟合的风险。当分类器过度拟合时,它在训练集上表现优秀,但在新的未见样本上表现较差。这是因为过度拟合的分类器过于依赖于训练数据中的每个样本,包括错误分类的样本。如果我们忽略这些错误分类的样本,我们可以得到一个更加泛化的分类器,能够更好地推广到未知数据上。 然而,忽略翻转覆盖率也有一些不足之处。首先,错误分类的样本可能包含有关分类问题的重要信息,忽略它们可能导致忽略这些信息。其次,忽略翻转覆盖率可能导致过度关注间隔的最大化,而忽略其他分类准则,例如更好地区分不同类别的样本。 在实际应用中,是否忽略翻转覆盖率取决于具体问题和数据集的特点。如果担心过度拟合,可以选择忽略翻转覆盖率。如果错误分类的样本对于分类问题的重要性较高,或者关注其他分类准则的最大化,那么可以选择不忽略翻转覆盖率。综上所述,忽略翻转覆盖率SV中的一个策略,可以根据实际需求是否采用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值