Title

SystemVerilog -- 10.0 SystemVerilog Functional Coverage

SystemVerilog Functional Coverage

covergroup 和 VCS 获取 coverage 的主要区别

  1. covergroup用于功能覆盖率收集,而vcs主要用于代码覆盖率收集。
  2. covergroup需要在设计代码中显示定义和实例化,通过sample()方法触发采样。vcs则在编译和仿真时通过命令行选项指定需要收集的覆盖率类型,无需在代码中显示定义。
  3. covergroup收集的是设计功能点的覆盖情况,如状态机覆盖、输入组合覆盖等,由验证工程师根据设计定义。vcs收集的是代码执行路径的覆盖情况,如语句覆盖、分支覆盖等,由工具自动从RTL代码提取。
  4. covergroup的覆盖率通过get_coverage()等方法获取,vcs的覆盖率需要通过urg、DVE等工具从数据库文件中生成报告查看。
  5. 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

posted on 2024-05-11 22:53  松—松  阅读(3)  评论(0编辑  收藏  举报

导航