(十四)覆盖率类型、覆盖率组
一、覆盖率类型
- 覆盖率是用来衡量设计验证完备性。
- 随着测试逐步覆盖各种合理的组合,覆盖率用来衡量测试进行的程度。
- 覆盖率工具会在仿真过程中收集信息,然后进行后续处理并且得到 覆盖率报告。
- 通过报告找出覆盖盲区,然后修改现有test或者创建新的test来填补这些盲区。
- 这个过程可以一直迭代进行,直到覆盖率达到KPI要求,一般要求覆盖率100%。
覆盖率反馈环路
1、代码覆盖率
代码覆盖率是由仿真工具仿真完成后自动收集的
- 行覆盖率line coverage :所有行是否都运行到
- 路径(分支)覆盖率paths coverage/(branch coverage) :所有路径是否以cover到
- 翻转覆盖率toggle coverage :所有变量都有过静态的稳定状态0、1,和动态的0,1翻转
- 状态机覆盖率FSM coverage :状态机中所有状态都已运行到,状态之间的应该有的跳转也都已运行到
2、功能覆盖率
- 验证的目的: 确保设计在实际环境中的行为正确。
- 功能描述文档详细说明了设计应该如何 运行,而验证计划则列出了相应的功能应该如何激励、验证和测量。
- 功能覆盖率是和功能设计紧密相连的,而代码覆盖率则是衡量设计的实现情况。
- 若某个功能在设计中被 遗漏,代码覆盖率不能发现这个错误,但是功能覆盖率可以。
3、断言覆盖率
- 断言:用于一次性地或在一段时间内核对两个设计信号之间关系的声明性代码。
- 断言可以用于查找感兴趣的信号的值或者状态。最常用于 查找错误,例如两个信号间的相位关系,是否应该互斥或者请求与许可信号之间的时序等,一旦检测到问题,仿真就可以立即 停止。
- 可以使用 cover property来测量这些关心的信号的值或者状态是否发生。
- 在仿真结束时,仿真工具可以自动生成断言覆盖率数据,断言覆盖率数据以及其它覆盖率数据都会被集成在同一个覆盖率数据库中。
二、覆盖率组
1、覆盖策略
- 收集的是信息的覆盖率,而不是具体数据的覆盖率。
- 应该只测量你会用来分析并且改进测试的那部分数据,所以设定合理的覆盖率采样的事件,一方面提升采样效率,一方面也可以降低收集覆盖率的开销
- 如果功能覆盖率高但代码覆盖率低,这说明验证计划不完整,测试没有执行设计的所有代码。
- 如果代码覆盖率高但功能覆盖率低,这说明即使测试平台很好地执行了设计的所有代码,但
是测试还是没有把设计定位到所有对应的功能上,或者设计代码本身功能没有写完整。
2、覆盖组 covergroup
- covergroup可以包含一个或者多个coverpoint,且全都在同一时间采集。
- covergroup可以定义在类中,也可以定义在interface或者module中,一个类里可以包含多个covergroup。
- covergroup可以采样任何可见的变量,例如程序变量、接口信号或者设计端口。
- 当你拥有多个独立的covergroup时,每个covergroup可以根据需要自行使能或者禁止。
- 每个covergroup可以定义单独的触发采样事件,允许从多个源头收集数据。
- covergroup一次定义后可多次实例化,必须被例化才可以用来收集数据。
covergroup 的采样触发
- covergroup由采样的数据和数据被采样的事件构成。当这两个条件都准备好以后,测试平台便会自动触发covergroup,并且会去收集覆盖率。
- 这个过程可以通过直接使用sample()函数完成,也可以在covergroup中采样阻塞表达式或者使用wait或@实现在信号或事件上的阻塞来自动触发采样。
示例1:
通过事件来触发采样:
event trans_ready;
covergroup CovPort @(trans_ready);coverpoint ifc.cb.port;
endgroup
示例2:
class Transaction;rand bit [31:0] data;rand bit [ 2:0] port; // Eight port numbers
endclassinterface busifc(input bit clk);logic [31:0] data;logic [ 2:0] port;modport TB(input clk,output port,data);endinterface program automatic test(busifc.TB ifc);covergroup CovPort;coverpoint ifc.port; // Measure coverage
endgroupinitial beginTransaction tr;CovPort ck;ck = new(); //实例化覆盖组tr = new();repeat (32) begin // Run a few cyclesassert(tr.randomize); // Create a transactionifc.port <= tr.port; ifc.data <= tr.data; ck.sample(); // Gather coverage@(posedge ifc.clk); // Wait a cycleend
end
endprogrammodule top;logic clk;
initial beginclk = 0;forever #5 clk = ~clk;
endbusifc ifc(clk);test u_test(ifc);endmodule
对sample采样分析:
方式一:port覆盖率及波形
问题:循环了5次,但采样覆盖率只有4次,波形上也出现5次data的变化
initial beginTransaction tr;CovPort ck;ck = new(); //实例化覆盖组tr = new();repeat (5) begin // Run a few cyclesassert(tr.randomize); // Create a transactionifc.port <= tr.port; ifc.data <= tr.data; ck.sample(); // Gather coverage@(posedge ifc.clk); // Wait a cycleend#20;$finish;
end
方式二:port覆盖率及波形
1、改成阻塞赋值后sample采样覆盖率变为5次
initial beginTransaction tr;CovPort ck;ck = new(); //实例化覆盖组tr = new();repeat (5) begin // Run a few cyclesassert(tr.randomize); // Create a transactionifc.port = tr.port; ifc.data = tr.data; ck.sample(); // Gather coverage@(posedge ifc.clk); // Wait a cycleend#20;$finish;
end
方式三:port覆盖率及波形
1、改成在时钟上升沿之后sample采样,覆盖率变为5次
initial beginTransaction tr;CovPort ck;ck = new(); //实例化覆盖组tr = new();repeat (5) begin // Run a few cyclesassert(tr.randomize); // Create a transactionifc.port <= tr.port; ifc.data <= tr.data; @(posedge ifc.clk); // Wait a cycleck.sample(); // Gather coverageend#20;$finish;
end
说明:
- 通过方式二、方式三说明非阻塞赋值没有在sample()采样之前完成,所以漏采样了一次,阻塞赋值是立刻完成赋值的,这与时间片timeslot有关,但这并不能说明非阻塞赋值必须在时钟沿完成和sample()漏采的是第一次port数据和它是往时钟沿前采样的
方式四:port覆盖率及波形
1、将时钟上升沿改成延时12ns
initial beginTransaction tr;CovPort ck;ck = new(); //实例化覆盖组tr = new();repeat (5) begin // Run a few cyclesassert(tr.randomize); // Create a transactionifc.port <= tr.port; ifc.data <= tr.data; ck.sample(); // Gather coverage#12 //delay 12nsend#20;$finish;
end
说明:
- 数据变化按照波形所示的12ns发生变化一次,所以非阻塞赋值不是只能在时钟沿完成,应该在每个时钟片都会执行,但在时钟片中的左右赋值时间不同
方式五:port覆盖率及波形
1、在repeat循环完之后再采样一次,覆盖次数变为5次
initial beginTransaction tr;CovPort ck;ck = new(); //实例化覆盖组tr = new();repeat (5) begin // Run a few cyclesassert(tr.randomize); // Create a transactionifc.port <= tr.port; ifc.data <= tr.data; ck.sample(); // Gather coverage@(posedge ifc.clk); endck.sample();#20;$finish;
end
说明:
- 在最后在多采样一次,次数变为5次,且次数是在auto[4]加1,结合波形最后一次随机出的也是4,说明sample采样是往前采样的
示例3:mailbox操作
class Transaction;rand bit [31:0] data;rand bit [ 2:0] port; // Eight port numbers
endclassinterface busifc(input bit clk);logic [31:0] data;logic [ 2:0] port;//modport TB(input clk,output port,data);endinterface class Transactor;Transaction tr;mailbox mbx_in;virtual busifc ifc;covergroup CovPort;coverpoint tr.port;
endgroupfunction new(mailbox mbx_in, virtual busifc ifc);CovPort = new(); //实例化groupthis.mbx_in = mbx_in;this.ifc = ifc;
endfunctiontask main;beginmbx_in.get(tr);ifc.port <= tr.port;ifc.data <= tr.data;CovPort.sample();end
endtaskendclass
program automatic test(busifc ifc,input bit clk);initial beginTransaction tr;mailbox mbx_in;Transactor tr_c;tr = new();mbx_in = new();tr_c = new(mbx_in,ifc);repeat (5) begin // Run a few cyclesassert(tr.randomize); // Create a transactionmbx_in.put(tr);tr_c.main(); // send driver and gather coverage@posedge(clk); // Wait a cycleend#20;$finish;
end
endprogrammodule top;logic clk;
initial beginclk = 0;forever #5 clk = ~clk;
endbusifc ifc(clk);test u_test(ifc,clk);endmodule
说明:
- 使用mailbox操作,同步了sample函数的采样问题,覆盖采样次数就为5次
(十四)覆盖率类型、覆盖率组相关推荐
- Exchange server 2013(十四)WSUS部署及组策略设置(2)
我们继续上一节未完的博客,继续我们的WSUS设置.[上一章节标题:Exchange server 2013(十四)WSUS部署及组策略设置(1) 网址:http://1183839.blog.51ct ...
- java编程思想第四版第十四章 类型信息习题
fda dfa 第三题u package net.mindview.typeinfo.test4;import java.util.ArrayList; import java.util.Arrays ...
- 《Java编程思想》第四版读书笔记 第十四章 类型信息
2019独角兽企业重金招聘Python工程师标准>>> 14.2 RTTI运行时类型识别. Class对象包含了与类有关的信息,Java使用Class对象来执行其RTTI.每个类都有 ...
- java面试题十四 基本类型的默认值
以下程序输出结果为 答案
- 每日一题冲刺大厂第十四天 NOIP普及组 三连击
大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!
- 第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-职业院校组-知识点题解
这个题解是参考了"海底烧烤店ai"一位非常优秀的全栈领域创作者的博主写的,自己在看的时候发现个人知识点比较欠缺,所以就在题解下面添加了一些知识点,便于理解. 原博主的文章链接如下: ...
- SV学习笔记—覆盖率类型
0.前言 覆盖率是用来衡量设计验证完备性,随着测试逐步覆盖各种合理的组合,覆盖率用来衡量测试进行的程度,覆盖率工具会在仿真过程中收集信息,然后进行后续处理并且得到覆盖率报告,通过报告找出覆盖盲区,然后 ...
- 【第十四届蓝桥杯单片机组客观题1】
第十四届蓝桥杯单片机组客观题1 以下客观题来自4T测评的模拟题,希望可以帮助到大家,加油丫 1.C 若希望将IAP15F2K61S2单片机的IO口输出电流能力较强,应将IO配置为( )模式. A : ...
- Java从键盘输入n行字符串_Java十四天零基础入门-Java布尔类型
不闲聊!!!不扯淡!!!小UP只分享Java相关的资源干货 Java布尔类型 在Java语言中布尔类型的值只包括true和false,没有其他值,不包括1和0,布尔类型的数据在开发中主要使用在逻辑判断 ...
最新文章
- 完整代码+实操!手把手教你操作Faster R-CNN和Mask R-CNN
- 卧槽!看不懂这些动图,你不配做个程序员
- 如何选择版本控制系统之二
- 一位 83 岁独立开发者教会我的道理
- 超简单JS实现把鼠标选中文字发送到新浪微博
- Docker集群管理之Swarm介绍
- LoNg wAy tO Go
- 于谦一共收了几个徒弟,为什么?
- 下个月,Java 开启收费模式!
- SSD5_ Exam 2分析
- cad小插件文字刷_必备CAD插件大全,内含最全字体库
- 铝合金轨道系统组合型式和配件名称
- 攻防比赛中蓝队常用的攻击方法
- 上海康桥先进制造技术创业园项目远程预付费系统的应用-安科瑞耿敏花
- Struts2+Spring+Hibernate 三大框架的合并集成
- 工作的驱动力——成就感
- 黑帽SEO主要作弊方法
- 微信转账2020假图片_2020精致简约背景图片 | 简约唯美的微信朋友圈背景图
- google reader 和 抓虾
- 家长育儿风格决定教育效果!