覆盖率是衡量验证完备性的重要指标
覆盖率提现验证的充分性
功能覆盖率成为衡量验证进度以及验证充分性的重要手段,提供了一个标志验证工作完成的相对客观指标。可以根据覆盖率的情况随时调整验证的策略,调整验证资源。功能覆盖率和设计意图紧密相连,代码覆盖率衡量设计的实现情况。
1.覆盖率的类型
代码覆盖率:检查代码是否冗余,设计要点是否被遍历,被检测的对象是RTL设计代码,由仿真工具自动生成;用来度量被检测代码中每个执行语句是否被执行到。
功能覆盖率:检查规格功能是否被覆盖,被检测对象是自定义的容器,需要采样收集条件;度量哪些设计规格以及被测试用例测试过的一个指标。最终覆盖率要求为100%。
断言覆盖率:断言是用于一次性或者在一段时间内核对两个设计信号之间关系的声明代码;可以随设计和测试平台一起仿真,也可以被形式检查工具所证实。最终覆盖率要求为100%。
代码条件覆盖:度量条件语句的每个子表达式是否被测试到了;
分支覆盖率:
事件覆盖率:
跳转覆盖率:
状态机覆盖率:
2.验证完备性
//一个简单对象的功能覆盖率
Program automatic test (busifc.TB ifc);
Class Transaction;
rand bit [31:0] data ;
rand bit [2:0] port; //八种端口数据
Endclass
covergroup CovPort;
covergroup tr.port; //测量覆盖率
endgroup
initial begin
Transaction tr;
CovPort ck;
ck = new(); //实例化组
tr = new();
repeat (32) begin //运行几个周期
assert (tr.randomaize); //创建一个事物
ifc.cb.data <= tr.port; //并发送到接口上
ifc.cab.data <= ta.data;
ck.sample (); //收集覆盖率
@ifc.cab; //等待一个周期
end
end
endprogam
3.覆盖组
面向数据的覆盖率对已知的数据组合检查,可以通过编写覆盖组、覆盖点、和交叉覆盖获得面向数据的覆盖率。功能覆盖率执行过程首先是覆盖组然后覆盖点和交叉覆盖,但是最终是以“各种仓”作为基本元素(落脚点)。仓代表了这个数据或者这个表达式出现了该数据。
4.定义覆盖模型
覆盖组的结构(covergroup construct)是一种用户自定义的类型,一旦被定义就可以创建多个实例,就想类一样,也是通过new()来创建实例的。覆盖组可以定义在module/program/interface以及class中。
5.功能覆盖率的术语
覆盖率点:对一个信号或者变量出现的值定义或分类。
交叉覆盖率点:对多个相互关联的信号或者变量可能出现的值正交叉值,可以是多个。
标签:用来标识覆盖率的点
变量:被采集的信号线,变量或者标签的交叉
选项:覆盖率点的控制信息
仓(容器):分为自创建仓和自定义仓,交叉覆盖率点只能包含自创建仓
忽略容器:不关心的仓
非法容器:不允许被击中的仓