SystemVerilog学习笔记——功能覆盖率(一)

文章目录

  • 功能覆盖率
  • 一、覆盖率的类型
    • 1、代码覆盖率
    • 2、功能覆盖率
    • 3、漏洞率
  • 二、功能覆盖策略
  • 三、功能覆盖率的简单例子


功能覆盖率

功能覆盖率是用来衡量哪些设计特征已经被测试程序测试过的一个指标。可以使用一个反馈环路来分析覆盖的结果,并决定采取哪种行动来达到100%的覆盖率。首要的选择式使用更多的种子来运行现有的测试程序,其次是建立新的约束。只有在确实需要的时候才会创建定向测试。

覆盖率收敛:
SystemVerilog学习笔记——功能覆盖率(一)_第1张图片
显式的覆盖率是在测试环境中使用SV特性直接描述的,隐含的覆盖率则是暗藏在测试中。 收集覆盖率数据,可以通过改变随机种子,就可以反复运行同一个随机测试平台来产生新的激励,每一次仿真都会产生一个带有覆盖率信息的数据库,记录随机游走的轨迹。

覆盖率操作流程:
SystemVerilog学习笔记——功能覆盖率(一)_第2张图片
通过分析覆盖率数据可以决定如何修改测试集。

通过仿真器覆盖率数据分析工具你可以:

运行一个带多个种子的测试。使用不同的随机种子反复地运行这个约束集。
检查运行通过与否。功能覆盖信息只在仿真运行成功时才有效,当由于设计里存在漏洞而使得仿真失败时,必须丢弃覆盖率信息。
分析通过多次运行得到的覆盖率。如果约束所指向的区域还没有达到100%覆盖率,但是覆盖率一直在增加,那么就继续运行更多的种子。如果覆盖率已经稳定下来,不再继续增长,那么就应该考虑修改约束,最后必要时考虑编写定向测试。

一、覆盖率的类型

1、代码覆盖率

这种方式衡量的是多少行代码已经被执行过,在穿过代码和表达式的路径中有哪些已经被执行过(路径覆盖率),哪些单比特变量的值为0或1(翻转覆盖率),以及状态机中哪些和状态转换已经被访问过(有限状态机覆盖率)。代码覆盖率衡量的是测试对于设计规范的“实现”究竟测试得多彻底,而非针对验证计划,虽然达到100%覆盖率,但是有可能设计代码本身就有缺陷。

2、功能覆盖率

功能覆盖率是和设计意图紧密相连的,有时也被称为“规范覆盖率”,而代码覆盖率则是衡量设计的实现情况。如果某个代码块在设计中被漏掉,代码覆盖率不能发现,但是功能覆盖率可以。

3、漏洞率

衡量覆盖率的一个间接的方式是查看新漏洞出现的比率。

一个项目中的漏洞率:
SystemVerilog学习笔记——功能覆盖率(一)_第3张图片
4、断言覆盖率
1)断言是用于一次性地或在一段时间内核对两个设计信号之间关系的声明性代码。
2)断言可以拥有局部变量并且可以进行简单的数据检查。
3)断言最常用于查找错误,一旦检测到问题,仿真就会立即停止。
4)有些断言会被用于查找感兴趣的信号值或者设计状态。这要用到cover property语句,用于观测信号序列,而覆盖组则对仿真过程中的数值和事务进行采样。覆盖组可以在信号序列结束时触发,序列可以收集信息供覆盖组使用。
5)使用断言覆盖率可以测量这些断言被触发的频繁程度。

二、功能覆盖策略

1、收集信息而非数据
例如测试一个容量为1K的FIFO存储器,测试它读写地址索引里的数据,这有上百万种可能的组合,只需要成功读出所有的数据即可。设计信号如果数量范围太大的话,应该拆分成小范围再加上边界情形。

2、只测量将会使用到的内容
收集功能覆盖率数据的开销很大,所以应该只测量将会用到的测试内容。在编译、初始化、触发时刻都能控制覆盖率数据,也可以使用条件编译或者对覆盖率信息的收集实行抑制。

3、测量的完备性
覆盖率比较:
SystemVerilog学习笔记——功能覆盖率(一)_第4张图片

三、功能覆盖率的简单例子

  • 为了测试功能覆盖率,应首先编写验证计划和相对应的用于仿真的可执行版本。
  • SV测试平台中要对变量和表达式的数值进行采样,这些采样的地方就是覆盖点。
  • 在同一时间点上(比如当一个事务处理完成时)的多个覆盖点被一起放在一个覆盖组里。
    一个简单对象的功能覆盖率
/*
创建了一个随机的事务并把它驱动到接口上。
测试程序使用CovPort覆盖组对port字段的数值进行采样。
*/
program automatic test(busifc.TB ifc);
	class Transaction;
		rand bit[31:0] data;
		rand bit[2:0] port;		//八种端口(port)数据
	endclass

	covergroup CovPort;
		coverpoint tr.port;		//测量覆盖率
	endgroup

	initial begin
		Transaction tr;
		CovPort ck;
		ck = new();				//实例化组
		tr = new();
		repeat(32) begin		//运行几个周期
			assert(tr.randomize);		//创建一个事务
			ifc.cb.port <= tr.port;		//并发送到接口上
			ifc.cb.data <= tr.data;		
			ck.sample();				//收集覆盖率
			.cb;					//等待一个周期
		end
	end
endprogram

覆盖率报告:
SystemVerilog学习笔记——功能覆盖率(一)_第5张图片
从生成的覆盖率报告看出,测试平台产生了1,2,3,4,5,6,7的port,但是没有产生数值为0的port。at least一栏标出的是一个仓(bin)被认为已经被覆盖所需要的最低命中(hit)次数。
一个简单对象的覆盖率报告(100%覆盖):
SystemVerilog学习笔记——功能覆盖率(一)_第6张图片
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39794062/article/details/113446119

你可能感兴趣的:(sv,硬件工程,学习)