【问题标题】:functional_coverage not showing proper result功能覆盖没有显示正确的结果
【发布时间】:2015-03-11 23:49:26
【问题描述】:

我开发了一个简单的 uvm 测试台来验证一个简单的加法器。我也使用功能覆盖率来监控覆盖率。加法器为 8 位,输入为 ab,输出为 c,即 9 位。

我为ab 开发了带有8 位rand logic 的事务。 按顺序,我使用repeat(100) 运行它,它将随机化并将ab 驱动到DUT。这种情况下功能覆盖率的最佳情况是 (100/256)*100%,即假设不会重复任何值,约为 40%。我在记分牌中对覆盖率进行采样,并在 env 中获取覆盖率结果。

这是我的代码 sn-ps

// monitor class
  covergroup cg;
    a : coverpoint sb_item.a;
    b : coverpoint sb_item.b;
  endgroup
  ...
  function void write(input input_seq_item i);
    sb_item = i;
    if(sb_item.c == sb_item.a + sb_item.b)
      begin
        `uvm_info("SB","OK!",UVM_LOW)
        cg.sample();
      end
      else
        `uvm_error("SB",$sformatf("ERROR! %b + %b = %b", sb_item.a, sb_item.b, sb_item.c), UVM_LOW)
  endfunction

  // env class
  ...
  task run_phase(uvm_phase phase);
    sb.cg.stop();
    phase.raise_objection(this);
    sb.cg.start();
    seq.start(sqr);
    phase.drop_objection(this);
    sb.cg.stop();
    `uvm_info("env",$sformatf("The coverage collected is %f",sb.cg.a.get_coverage()),UVM_LOW);
  endtask
  ...

当我运行代码时,我得到了大约 81 的覆盖率。结果如下所示

# KERNEL: UVM_INFO /home/runner/monitor.sv(56) @ 996: uvm_test_top.env.sb [SB] OK!
# KERNEL: UVM_INFO /home/runner/env.sv(34) @ 996: uvm_test_top.env [env] The coverage collected is 85.937500
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-1.2/src/base/uvm_objection.svh(1271) @ 996: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
# KERNEL: UVM_INFO /home/build/vlib1/vlib/uvm-1.2/src/base/uvm_report_server.svh(855) @ 996: reporter [UVM/REPORT/SERVER] 
# KERNEL: --- UVM Report Summary ---
# KERNEL: 
# KERNEL: ** Report counts by severity
# KERNEL: UVM_INFO :  204
# KERNEL: UVM_WARNING :    0
# KERNEL: UVM_ERROR :    0
# KERNEL: UVM_FATAL :    0
# KERNEL: ** Report counts by id
# KERNEL: [Driver]   100
# KERNEL: [RNTST]     1
# KERNEL: [SB]   100
# KERNEL: [TEST_DONE]     1
# KERNEL: [UVM/RELNOTES]     1
# KERNEL: [env]     1
# KERNEL: 
# RUNTIME: Info: RUNTIME_0068 uvm_root.svh (521): $finish called.
# KERNEL: Time: 996 ns,  Iteration: 61,  Instance: /top,  Process: @INITIAL#14_0@.
# KERNEL: stopped at time: 996 ns
# VSIM: Simulation has finished. There are no more test vectors to simulate.
exit
# FCOVER: Covergroup Coverage data has been saved to "fcover.acdb" database.
# VSIM: Simulation has finished.

谁能解释我在这里犯了什么错误?覆盖率是否在所有运行中累积?

【问题讨论】:

    标签: system-verilog uvm function-coverage


    【解决方案1】:

    覆盖率是否在所有运行中累积取决于您正在分析的内容。不过,我猜你只分析一个模拟。您的计算是正确的,每次测试可以获得的最大覆盖率约为 40%(基本上每个覆盖点为 40%,加起来平均),但这不太可能达到。

    您还需要查看(除了百分比之外)实际创建的垃圾箱。我不认为您会为ab 的每个值获得一个bin,但其中一些可能会聚集在一起(即[ 0..3 ] 中的a 将是一个bin,依此类推,给你留下 256/4 个箱子而不是 256 个)。每个覆盖点都有一个名为 auto_bin_max 的选项,其默认值为 64。如果将其设置为 256 或为 ab 可以采用的每个值显式声明(范围)bin,您将获得覆盖您期望的百分比。

    附带说明一下,您通常不会为数据项的每个值创建覆盖范围,因为这没有任何意义。在典型的设备中,数据项可以采用的值太多,您无法全部验证。然而,你会做的是为更“有趣”的情况声明垃圾箱。在您的情况下,有趣的值是 08'hff 以及介于两者之间的任何值。还特别有趣的是交叉ab 并检查组合,尤其是ab 都是8'hff 的情况(因为那是你的结果会溢出8 位并输出进位的地方。

    【讨论】:

    • 您能否告诉我如何查看哪些垃圾箱被覆盖而不是特定覆盖点?我正在使用 Riveria-Pro 模拟器
    • @user1978273 我不是 Riviera-PRO 用户,所以我不能说。您必须在手册中查找它。
    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多