SystemVerilog -- 10.0 SystemVerilog Functional Coverage
SystemVerilog Functional Coverage
covergroup 和 VCS 获取 coverage 的主要区别
- covergroup用于功能覆盖率收集,而vcs主要用于代码覆盖率收集。
- covergroup需要在设计代码中显示定义和实例化,通过sample()方法触发采样。vcs则在编译和仿真时通过命令行选项指定需要收集的覆盖率类型,无需在代码中显示定义。
- covergroup收集的是设计功能点的覆盖情况,如状态机覆盖、输入组合覆盖等,由验证工程师根据设计定义。vcs收集的是代码执行路径的覆盖情况,如语句覆盖、分支覆盖等,由工具自动从RTL代码提取。
- covergroup的覆盖率通过get_coverage()等方法获取,vcs的覆盖率需要通过urg、DVE等工具从数据库文件中生成报告查看。
- covergroup收集覆盖率回带来较大的性能开销,需要根据需求选择性收集。vcs收集代码覆盖率的开销较小。
总的来说, covergroup侧重功能验证的全面性,vcs侧重代码实现的完整性,两者结合可以更好地评估验证的质量。
What is functional coverage ?
functional coverage是测试对设计的哪些功能/特性的衡量。这在约束随机验证(CRV)中非常有用,可以了解回归中的一组测试涵盖了哪些特征。
What are its limitations ?
这仅与为它编写的代码一样好。假设您在设计文档中提到了10个功能,但您不知何故忽略/遗漏或不知道3个功能,您将只为其中7个功能编写功能覆盖代码。如果所有7个功能都在测试中被击中,您可能会得出结论,所有功能都已涵盖。因此,您需要确保设计规范中的所有必须信息都包含在功能覆盖块中。
How is functional coverage done in SystemVerilog ?
这个想法是在testbench中对特定的变量进行采样,并分析它们是否达到了特定的值集。
mode test;
bit [3:0] mode;
bit [1:0] key;
// Other testbench code
endmodule
mode
可以取16个值,而key可以取4个值。因此,如果在模拟中监视这两个变量并报告已执行的模式和键值,您将知道测试是否涵盖了特定功能。好的部分是,模拟器中有一些选项可以将此类覆盖率详细信息转储到文件中,以便在模拟完成后可以对其进行查看。此外,您可以将来自不同测试的所有此类覆盖率文件合并到一个数据库中,并将它们作为一个整体进行审查。如果测试A覆盖了特征X,测试B覆盖了特征Y,则合并后的数据库将显示您同时覆盖了X和Y。
How to write covergroups ?
class myTrns;
rand bit [3:0] mode;
rand bit [1:0] key;
function display ();
$display ("[%0tns] mode = 0x%0h, key = 0x%0h", $time, mode, key);
endfunction
covergroup CovGrp;
coverpoint mode {
bins featureA = {0};
bins featureA = {[1:3]};
bins common [] = {4:$};
bins reverse = default;
}
coverpoint key;
endgroup
endclass
Note
- varibles are mentioned as a.
coverpoint
- Coverpoints are put together in a block.
covergroup
- Multiple covergroups can be created to sample the same variables with different set of bins.
bins
are said to be "hit/covered" when the variable reaches the corresponding values. So, the bin featureB is hit when mode takes either 1, 2 or 3.- bin reverse is a single bin for all values that do not fall under the other bins.
- common will have 12 separate bins, one for each value from 0x4 to 0xF.
Why are coverage metrics missing in simulations ?
您必须启用工具供应商特定的命令行开关才能转储覆盖率详细信息。然后打开覆盖率查看器工具,如 Cadence ICCR/IMC 并打开覆盖率转储文件。
How to specify when to sample ?
有两种方法可以在封面组中触发覆盖范围收集。
- 使用特定 covergroup 的 sample() 方法对该 group 中的 coverpoint 进行采样。
class myCov;
covergroup CovGrp;
...
endgroup
function new ();
CovGrp = new; // Create an instance of the covergroup
endfunction
endclass
module tb_top;
myCov myCov0 = new (); // Create an instance of the class
initial begin
myCov0.CovGrp.sample (); // sample() 触发 covergroup 采样
end
endmodule
- 提及对covergroup进行采样的事件
covergroup CovGrp @ (posedge clk); // Sample coverpoints at posedge clk
covergroup CovGrp @ (eventA); // eventA can be triggered -> eventA
What are the ways for conditional coverage ?
是的,您可以通过两种方式有条件地启用覆盖范围。
- 使用构造
iff (条件)
给 coverpoint 添加条件,常用于复位期间关闭覆盖
covergroup CovGrp;
coverpoint mode iff (!_if.reset) {
// bins for mode
}
endgroup
- 使用和功能
start
stop
, 使能、关闭覆盖率收集
CovGrp cg = new;
initial begin
#1 _if.reset = 0;
cg.stop ();
#10 _if.reset = 1;
cg.start ();
end