SystemVerilog Functional Coverage
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 ();
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
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
标签:10.0,SystemVerilog,--,CovGrp,mode,key,covergroup,bins
From: https://www.cnblogs.com/sys-123456/p/18185324