0

我正在尝试为我的设计编写功能覆盖。我编写了所需的封面组,但现在我面临着在测试运行之间传输我的覆盖范围的困难。这里有几个代码示例:

`include "uvm_macros.svh"
package t;
    import uvm_pkg::*;

    class test extends uvm_test;
        `uvm_component_utils(test)
        byte unsigned data;
        covergroup cg;
            dat: coverpoint data;
        endgroup

        function new(string name, uvm_component parent);
            super.new(name,parent);
            cg = new();
        endfunction: new

        task run_phase(uvm_phase phase);
            phase.raise_objection(this);
            repeat(5) begin
                #5data = $urandom();
                #10 cg.sample();
            end
            phase.phase_done.set_drain_time(this, 50ns);
            phase.drop_objection(this);
        endtask
    endclass: test
endpackage

module top();
    import uvm_pkg::*;
    import t::*;
    initial begin
        $load_coverage_db("coverage_report.db");
        $set_coverage_db_name("coverage_report.db");
        run_test();
    end
endmodule

如果我尝试在上面运行测试,我会收到此错误:

** 错误:(vsim-6844) Covergroup '/t/test/cg' 没有在模拟中创建实例,忽略它

显然,问题在于 cg 在测试开始后创建,而 config_db 在尚未创建时加载。所以我这样$load_coverage_db放置run_phase

`include "uvm_macros.svh"
package t;
    import uvm_pkg::*;

    class test extends uvm_test;
        `uvm_component_utils(test)
        byte unsigned data;
        covergroup cg;
            dat: coverpoint data;
        endgroup

        function new(string name, uvm_component parent);
            super.new(name,parent);
            cg = new();
        endfunction: new

        task run_phase(uvm_phase phase);
            $load_coverage_db("coverage_report.db");
            phase.raise_objection(this);
            repeat(5) begin
                #5data = $urandom();
                #10 cg.sample();
            end
            phase.phase_done.set_drain_time(this, 50ns);
            phase.drop_objection(this);
        endtask
    endclass: test
endpackage

module top();
    import uvm_pkg::*;
    import t::*;
    initial begin
        $set_coverage_db_name("coverage_report.db");
        run_test();
    end
endmodule

现在,我收到了这种类型的警告:

** 警告:(vsim-6841) Covergroup 实例 '/t::test::cg ' 存在于模拟中但未在数据库中找到

我需要做什么,才能让我的旧覆盖率在测试中?

4

1 回答 1

0

在我已经编写了一个 python 脚本,在每次运行测试后从导出到文本文件的覆盖率之后创建和更新我自己的 sqlite 数据库,我终于发现 questa sim 中有一个 vcover merge 命令可以合并所有测试的覆盖率.
据我了解,这是普遍接受的做法:保持每个测试的覆盖率并将它们合并在一起,而不是将总覆盖率加载到每个新测试中。但是仍然存在一个问题,即 vcover 的帮助很差,文档中几乎没有提到它。

于 2020-01-15T07:37:47.357 回答