functional_coverage 没有显示正确的结果
functional_coverage not showing proper result
我开发了一个简单的uvm testbench来验证一个简单的加法器。我也使用功能覆盖率来监控覆盖率。加法器为 8 位,输入为 a
和 b
,输出为 c
,即 9 位。
我已经为 a
和 b
开发了 8 位 rand logic
的交易。
按顺序,我有 运行 和 repeat(100)
,它将随机化并驱动 a
和 b
到 DUT。这种情况下功能覆盖的最佳情况是 (100/256)*100%,即假设没有重复值,大约 40%。我在记分牌中对覆盖率进行采样,并在环境中获得覆盖率结果。
这是我的代码片段
// 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.
谁能解释一下我在这里犯了什么错误?覆盖范围是所有 运行 的累积吗?
覆盖率是否在所有运行中累积取决于您分析的内容。不过,我猜你只分析了一个模拟。您的计算是正确的,每次测试可以获得的最大覆盖率约为 40%(每个覆盖点基本上为 40%,一起平均),但这不太可能达到。
您还需要查看(除了百分比之外)实际创建的垃圾箱。我认为您不会为 a
或 b
的每个值都得到一个 bin,但其中一些可能会聚集在一起(即 a
in [ 0..3 ]
将是一个箱子等等,剩下 256/4 个箱子而不是 256 个)。每个覆盖点都有一个名为 auto_bin_max
的选项,其默认值为 64。如果将其设置为 256 或为 a
或 b
可能采用的每个值明确声明一个(范围)bin,您将获得您期望的覆盖率。
附带说明一下,您通常不会为数据项的每个值都创建一个覆盖区间,因为这实际上没有意义。在一个典型的设备中,数据项可能有太多的值,您无法验证它们。但是,您要做的是为更多 "interesting" 情况声明垃圾箱。在您的情况下,有趣的值是 0
、8'hff
以及介于两者之间的任何值。同样特别有趣的是交叉 a
和 b
并检查组合,特别是 a
和 b
都是 8'hff
的情况(因为这就是你的结果会溢出 8 位并输出一个进位。
我开发了一个简单的uvm testbench来验证一个简单的加法器。我也使用功能覆盖率来监控覆盖率。加法器为 8 位,输入为 a
和 b
,输出为 c
,即 9 位。
我已经为 a
和 b
开发了 8 位 rand logic
的交易。
按顺序,我有 运行 和 repeat(100)
,它将随机化并驱动 a
和 b
到 DUT。这种情况下功能覆盖的最佳情况是 (100/256)*100%,即假设没有重复值,大约 40%。我在记分牌中对覆盖率进行采样,并在环境中获得覆盖率结果。
这是我的代码片段
// 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.
谁能解释一下我在这里犯了什么错误?覆盖范围是所有 运行 的累积吗?
覆盖率是否在所有运行中累积取决于您分析的内容。不过,我猜你只分析了一个模拟。您的计算是正确的,每次测试可以获得的最大覆盖率约为 40%(每个覆盖点基本上为 40%,一起平均),但这不太可能达到。
您还需要查看(除了百分比之外)实际创建的垃圾箱。我认为您不会为 a
或 b
的每个值都得到一个 bin,但其中一些可能会聚集在一起(即 a
in [ 0..3 ]
将是一个箱子等等,剩下 256/4 个箱子而不是 256 个)。每个覆盖点都有一个名为 auto_bin_max
的选项,其默认值为 64。如果将其设置为 256 或为 a
或 b
可能采用的每个值明确声明一个(范围)bin,您将获得您期望的覆盖率。
附带说明一下,您通常不会为数据项的每个值都创建一个覆盖区间,因为这实际上没有意义。在一个典型的设备中,数据项可能有太多的值,您无法验证它们。但是,您要做的是为更多 "interesting" 情况声明垃圾箱。在您的情况下,有趣的值是 0
、8'hff
以及介于两者之间的任何值。同样特别有趣的是交叉 a
和 b
并检查组合,特别是 a
和 b
都是 8'hff
的情况(因为这就是你的结果会溢出 8 位并输出一个进位。