SV覆盖率

前言:欢迎您,有缘人!

 

1.基于覆盖率动的验证技术

覆盖率是对RTL设计功能进行验证后达到的覆盖百分比

检查过程必须满足完整性和正确性,没有冗余的劳动

为了最小化验证工作量,使用覆盖率来衡量一个设计哪些功能测试过,哪些功能还没有被测试过

功能覆盖率是由验证工程师自己定义的,用于衡量设计规格是否被正确实现,具体内容体现在验正计划中

功能覆盖率用于检査设计的应用场景、边界条件、特殊变量或者设计条件是否被完的正确的测试或者确认过

2.覆盖率类型

2.1覆盖率类型:RTL代码覆盖率

  • 衡量验证进展的最简易方式就是使用代码覆盖率,不用添加额外的HDL代码,工具会通过分析源代码和增加隐藏代码来自动帮你完成代码覆盖率的设计;
  • 衡量测试案例验证覆盖了哪些设计规格在RTL中实现了,而不能衡量验证计划
  • 行覆盖率( Line Coverage):多少行代码已经被执行过
  • 有限状态机覆盖率( FSM Coverage):状态机中哪些状态和状态转换已经被访问过
  • 路径覆盖率( Path Coverage):在穿过代码和表达式的路径中有哪些已经被执行过,RTL代码中的路径分支(if-else语句)
  • 翻转覆盖率( Toggle Coverage):哪些单比特变量从0跳变到1,以及从1跳变到0
  • 表达式覆盖率( Expression coverage):RTL代码中的条件表达式,例如if(a&b&c)

2.2覆盖率类型:功能覆盖率

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

2.3覆盖率类型:断言覆盖率

Assertion Coverage断言覆盖率

  • 断言是一种声明性的代码,用于检查RTL代码中的信号之的的关系
  • 断言可以使用过程性的代码或者使用 Systemverilog Assertions
  • 断言可以检查信号的值或者设计的状态
  • cover property语句

2.4覆盖率类型:目标覆盖率

目标覆盖率是指在验证计划中规定的需要验证点的目标值。在验证计划中,当验证点实际覆盖率没有达到100%的时候,说明验证工作还未完成目标方案。没有达到100%的项目需要通过添加测试用例或者修改约束等来对其进行充分的验证。

3.功能覆盖率

3.1一个简单的功能覆盖率例子

//systemverilog绿皮书
//例题9.2 一个简单的功能覆盖率

program automatic teat (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//运行32周期
			assert(tr.randmoize);//创建一个事务
			ifc.cb.port<=tr.port;//并发送到接口上
			ifc.cb.data<=tr.data;
			ck.sample();//收集覆盖率
			@ifc.cb;//等待一个周期
		end
	end
endprogram

用VCS跑的报告! 

3.2定义覆盖组

覆盖组可以在程序、模块或类里定义。在所有的情况下,覆盖组都要进行明确的实例化后才可以开始采样。如果覆盖组定义在类里,实例化时使用最初的名字即可,不用另起名字。

//systemverilog绿皮书
//例题9.5 在类里定义功能覆盖率

class Transactor;
	Transaction tr;
	mailbox mbx_in;
	
	covergroup Covport;
		coverpoint tr.port;//测量覆盖率
	endgroup	
	
	function new(mailbox mbx_in);
		Covport = new();//实例化覆盖组
		this.mbx_in=mbx_in;
	endfunction
	
	task main;
		forever begin
			tr=mbx_in.get;//获取下一个事务
			ifc.cb.port<=tr.port;//发送到待测设计中
			ifc.cb.data<=tr.data;
			Covport.sample();//收集覆盖率
		end
	endtask
endclass

 covergroup

  • 封装覆盖率模型的规格
  • 每个 covergroup包含以下内容

一个时钟事件,用于同步采样厦盖点

一组覆盖点

覆盖点之间的交叉覆盖

可选的形式参数

覆盖率选项

  • Covergroup是用户定义的一种结构类型
  • 定义好类型之后,可以在不同的程序中多次例化
  • 跟 class类似,定义完成后,可以通过构造函数new()生成covergroup的实例
  • covergroup可以定义在 module, program, interface或class中
  • 一个 covergroup可以包含一个或多个覆盖点

一个覆盖点可以是一个变量或者一个表达式

每个覆盖点有一组bins值,这个值跟采样的变量或者变量的转换有关

Bins的值可以由用户自己定义,或者有EDA工具自动生成

Coyergroupe的命名要清晰明了,通过名称就可以确认覆盖的功能是什么最好跟验证计划统一

定义覆盖点:信号和表达式

  • 采样数据
  • 如何收集覆盖率信息?

在覆盖点中指定了变量和表达式, System Verilog创建了一组bins,用于记录那些采样到的数值

bins是一个功能覆盖率的衡量单位

在每次仿真结束时,生成的数据库中包含了采样后所有的bins

EDA分析工具可以读取这个数据库,生成一个覆盖率报告,报告中包含了设计中哪一部分被覆盖,以及总的覆盖率数值

  • 私有bins和总的覆盖率

计算一个覆盖点的覆盖率,首先确认盺有可能数值的总的数量

定义覆盖点:bins

采样数据:bins

  • 私有bins和总覆盖率

Systemverilog自动为覆盖点创建bins

一个N位的表达式有2N个有效值

一个3比特的变量port有8有效值

  • 限制自动生成的bins的数量

cover group 选项auto_ bin max指定自动生成bins的最大数量,默认值为64bins

定义覆盖点:表达式

定义覆盖点:条件覆盖

使用关键字用iff为覆盖点添加条件

定义覆盖点:状态调转覆盖

定义覆盖点:交叉覆盖

SV覆盖率_第1张图片

参数化覆盖率:提供代码的重用性

后记:过去四天,帮爷爷搭建了彩钢瓦棚子,体验了农村家庭的房屋建设。从购买材料到中间建设再到最终结束,有很多想法都是冲突的。他们往往按照自己的经验去解决各种问题,有好几个点都是通过自己的各种解释才使得匠人、爷爷等接受并且实施。最后一天,被支开去做其他事,果然他们又浪费了一下材料,结果爷爷也说匠人没弄好,等我看到,已经不能返工了。可以体会到农村人思想的封建、和素质低下的交流使得我必须逃离农村生活。不知道为什么,家人的那种脏话实在让我接受不了,在最后一天结束了,帮爷爷安装电视锅,侄女过来了,不知道干嘛,爷爷骂她:NMRLD,算了,还是自己努力吧。冲冲冲!

你可能感兴趣的:(systemverilog,systemverilog)