如何加载coverage_db?
How to load coverage_db?
我正在尝试为我的设计编写功能覆盖。我写了需要的封面组,但现在我面临着在测试 运行 之间传输我的报道的困难。
这里有一些代码示例:
`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
如果我尝试 运行 上面的测试,我得到这个错误:
** Error: (vsim-6844) Covergroup '/t/test/cg' has no instance created in simulation, ignoring it
很明显,问题是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
现在,我收到此类警告:
** Warning: (vsim-6841) Covergroup instance '/t::test::cg ' exists in simulation but not found in database
我需要做什么才能在测试中获得我的旧报道?
在我已经编写了一个 python 脚本之后,在每次 运行 从覆盖导出到文本文件的测试之后创建和更新我自己的 sqlite 数据库,我终于发现有一个questa sim 中的 vcover merge 命令合并了所有测试的覆盖范围。
据我了解,这是普遍接受的做法:保持每个测试的覆盖范围并将它们合并在一起,而不是将总覆盖范围加载到每个新测试中。
但是仍然存在一个问题,vcover 的帮助很差,文档中几乎没有提到它。
我正在尝试为我的设计编写功能覆盖。我写了需要的封面组,但现在我面临着在测试 运行 之间传输我的报道的困难。 这里有一些代码示例:
`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
如果我尝试 运行 上面的测试,我得到这个错误:
** Error: (vsim-6844) Covergroup '/t/test/cg' has no instance created in simulation, ignoring it
很明显,问题是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
现在,我收到此类警告:
** Warning: (vsim-6841) Covergroup instance '/t::test::cg ' exists in simulation but not found in database
我需要做什么才能在测试中获得我的旧报道?
在我已经编写了一个 python 脚本之后,在每次 运行 从覆盖导出到文本文件的测试之后创建和更新我自己的 sqlite 数据库,我终于发现有一个questa sim 中的 vcover merge 命令合并了所有测试的覆盖范围。
据我了解,这是普遍接受的做法:保持每个测试的覆盖范围并将它们合并在一起,而不是将总覆盖范围加载到每个新测试中。
但是仍然存在一个问题,vcover 的帮助很差,文档中几乎没有提到它。