Coverage基础知识整理

随着设计越来越复杂,采用受约束的随机测试方法(CRT:Constraint random test)是进行全面验证的有效途径。

通过输入随机测试向量到设计中,通过SVA检查设计的正确性。从而达到全面,自动的验证效果。

使用CRT不需要通过特性手动编写测试激励,但是为了确认随机激励中包含了目的数据,需要根据特性、验证计划来追踪测试的有效性。

Coverage覆盖率就是用来检查验证的完备性的工具,无论是定向测试还是随机测试都要使用覆盖率来衡量测试的进行程度。

· 代码覆盖率

1)衡量代码中的哪些内容被执行过 (Block)

2)组合逻辑表达式中执行情况(Expression)

3)信号的翻转覆盖率(flip)

4)有限状态机的状态覆盖率(FSM)

不需要增加任何逻辑,工具会在仿真过程中分析源代码来完成代码覆盖率的统计。

代码覆盖率100%并不代表验证工作的完成,例如在D触发器中复位逻辑被遗漏了,代码覆盖率中每一行都被测试过了,但是实现功能是有问题的。这样的错误是代码覆盖率无法检查出来的。

· 功能覆盖率

检查随机数据中是否包含目标数据,目标数据作为验证配置输入到DUT中,产生目标输出,通过SVA检查正确性。

例如:

covergroup group_name @CLK

coverpoint_name1 : coverpoint signal_1;

coverpoint_name2 : coverpoint signal_2{

bin bin_name1 [] = {[0:5]};

bin bin_name2    = {[6:8]};

}

endgroup

第一行:创建一个组,这个组的名字叫group_name ,触发信号是CLK高电平状态

第二行:在covergroup中建立一个名为coverpoint_name1的覆盖点,对象信号名为signal_1 ,如果没有定义bin的话,工具会默认检查signal_1所有可能出现的数值情况。例如signal_1是4bit位宽,工具在CLK高电平期间检查signal_1是否出现0~15范围内的数值case,并统计每个数值出现的次数。

第三行:在covergroup中建立一个名为coverpoint_name2的覆盖点,对象信号名为signal_2,通过bin指定了signal_2出现的数值情况为0,1,2,3,4,5 ,(6|7|8)。bin_name后接[]表示连续数值。

Function Coverage使用场合

在实际项目中,对时序控制模块一般不需要使用随机验证,根据单独特性配置定向验证Pattern就可以。

而数据处理模块,需要满足范围内的任意数的输入,所以采用随机验证的方式能够达到更全面的验证。而随机验证中就需要通过Function Coverage来确认随机数据中包含了目标数据。

Code Coverage使用场合

实际项目中,一般不会从0开始写代码,都是在已有项目代码的基础上,按照项目需求,对功能进行增删。为了效率化,对新代码,存在修改代码的验证必须使用Code Coverage确保验证完整性。对于流用的代码内容,因为是被验证过的代码,可视项目周期情况来判断是是否进行Code Coverage的验证。

Code Coverage覆盖率合并

按照验证List完成验证流程后,把所有验证Pattern的覆盖率通过工具合并为一个完成覆盖率文件,通过工具查看代码的执行情况。

覆盖率只是验证完成度的一个体现,并不能完全通过覆盖率来判断验证结束。

根据设计功能,特性在前期制订完整的验证计划,以及在验证过程中不断完善验计划才能帮助我们检查出更多问题,保证设计的正确性。

Coverage仿真指令整理

Irun的Coverage Command

-coverage <Coverage 方式>

b:代码块(block)

e:表达式(expression)

t:翻转,切换()

f:FSM状态机

u:function

all:以上所有Coverage 方式

通过:来指定多个coverage方式

-covdut <module name>

指定coverage的目标模块

必须指定目标模块,否则不能合并覆盖率

可指定多个目标模块

通过cell名指定,不能用例化名

Coverage数据库结构

./cov_work                                  //Coverage 数据库目录

       |---./design                           //设计名称目录

                |---xxx.ucm                  //设计信息文件

                |---./test                       //测试名称目录

                       |---./icc.ucd           //Coverage 文件(固定名称)

-covworkdir <数据库目录名称>   //指定数据库目录名称,默认为cov_work

-covdesign <设计名称>   //指定设计名称,默认为design

-covtest <测试名称>   //指定测试名称,默认为test

Coverage 例:

covergroup read_param @( ready)  //指定触发事件

count : coverpoint count {       //定义采样信号

bins count_low[] = {[0:5]};      //指定采样值的范围

bins count_high   = {[6:10]};

}

endgroup

covergroup env @(posedge start or mode )

slave :coverpoint slave;

master : coverpoint master;

m_to_s : cross slave,master;  //定义slave和master的交叉覆盖

endgroup

read_param r_param = new();

env u_env = new(); //创建实例化

initial begin

  #10 count = 1;

-> ready;          //触发条件ready作为一个事件,在采样信号值发生变化时,事件有效数据被采样。

#10 slave = 0;

u_env.sample(); //sample是covergroup的内置方法,调用这样方法时,covergroup的数据被采样

·····

$finish

end

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值