如何在 uvm 中打印覆盖率报告?
How to print coverage report in uvm?
我第一次尝试处理功能覆盖,所以我创建了一个 mem_cov.sv 文件,我在其中创建了一个覆盖 class 从 uvm_subscriber class 扩展它并实现了写入函数来对覆盖率进行采样。我正在尝试在 report_phase 中打印它,但它没有打印出来,我不确定我是否缺少打印它的东西。
This is the link of the code
https://www.edaplayground.com/x/3R8m
提供代码示例,这是我的覆盖范围 class 扩展自 uvm_subscriber class
class mem_cov extends uvm_subscriber#(mem_seq_item);
`uvm_component_utils(mem_cov)
real cov;
mem_seq_item tx;
covergroup cg;
READ_EN:coverpoint tx.rd_en {bins bin_0_1[] ={0,1};}
endgroup
extern function new(string name="mem_cov",uvm_component parent);
extern function void write( mem_seq_item t);
extern function void extract_phase(uvm_phase phase);
extern function void report_phase(uvm_phase phase);
endclass
function mem_cov::new(string name,uvm_component parent);
super.new(name,parent);
cg=new();
endfunction
function void mem_cov::write(mem_seq_item t);
tx=t;
cg.sample();
endfunction
function void mem_cov::extract_phase(uvm_phase phase);
cov=cg.get_coverage();
endfunction
function void mem_cov::report_phase(uvm_phase phase);
`uvm_info(get_full_name(),$sformatf("Coverage is
%d",cov),UVM_HIGH);
endfunction
在我的 env class 中,我已将监视器分析端口连接到订阅者的分析导出端口,这是来自 env class 的片段:
function void build_phase(uvm_phase phase);
super.build_phase(phase);
mem_cv= mem_cov::type_id::create("mem_cv",this);
endfunction : build_phase
function void connect_phase(uvm_phase phase);
mem_agnt.monitor.item_collected_port.connect(mem_cv.analysis_export);
endfunction : connect_phase
您的问题与覆盖范围无关。这与冗长有关。您正在打印冗长的报道 UVM_HIGH
。模拟的详细程度设置为 UVM_MEDIUM
(我认为这是默认设置)。所以,你的消息不会被打印出来。如果将详细程度降低到 UVM_MEDIUM
,则会打印:
function void mem_cov::report_phase(uvm_phase phase);
`uvm_info(get_full_name(),$sformatf("Coverage is %d",cov),UVM_MEDIUM)
endfunction
消息的详细级别是为了打印消息必须设置的详细级别。因此,级别为 UVM_HIGH
的消息只有在详细程度为 UVM_HIGH
或更高时才会打印。换句话说,如果您想要打印消息,请将详细程度设置为较低级别。
顺便说一句:宏后不需要分号。
我第一次尝试处理功能覆盖,所以我创建了一个 mem_cov.sv 文件,我在其中创建了一个覆盖 class 从 uvm_subscriber class 扩展它并实现了写入函数来对覆盖率进行采样。我正在尝试在 report_phase 中打印它,但它没有打印出来,我不确定我是否缺少打印它的东西。
This is the link of the code
https://www.edaplayground.com/x/3R8m
提供代码示例,这是我的覆盖范围 class 扩展自 uvm_subscriber class
class mem_cov extends uvm_subscriber#(mem_seq_item);
`uvm_component_utils(mem_cov)
real cov;
mem_seq_item tx;
covergroup cg;
READ_EN:coverpoint tx.rd_en {bins bin_0_1[] ={0,1};}
endgroup
extern function new(string name="mem_cov",uvm_component parent);
extern function void write( mem_seq_item t);
extern function void extract_phase(uvm_phase phase);
extern function void report_phase(uvm_phase phase);
endclass
function mem_cov::new(string name,uvm_component parent);
super.new(name,parent);
cg=new();
endfunction
function void mem_cov::write(mem_seq_item t);
tx=t;
cg.sample();
endfunction
function void mem_cov::extract_phase(uvm_phase phase);
cov=cg.get_coverage();
endfunction
function void mem_cov::report_phase(uvm_phase phase);
`uvm_info(get_full_name(),$sformatf("Coverage is
%d",cov),UVM_HIGH);
endfunction
在我的 env class 中,我已将监视器分析端口连接到订阅者的分析导出端口,这是来自 env class 的片段:
function void build_phase(uvm_phase phase);
super.build_phase(phase);
mem_cv= mem_cov::type_id::create("mem_cv",this);
endfunction : build_phase
function void connect_phase(uvm_phase phase);
mem_agnt.monitor.item_collected_port.connect(mem_cv.analysis_export);
endfunction : connect_phase
您的问题与覆盖范围无关。这与冗长有关。您正在打印冗长的报道 UVM_HIGH
。模拟的详细程度设置为 UVM_MEDIUM
(我认为这是默认设置)。所以,你的消息不会被打印出来。如果将详细程度降低到 UVM_MEDIUM
,则会打印:
function void mem_cov::report_phase(uvm_phase phase);
`uvm_info(get_full_name(),$sformatf("Coverage is %d",cov),UVM_MEDIUM)
endfunction
消息的详细级别是为了打印消息必须设置的详细级别。因此,级别为 UVM_HIGH
的消息只有在详细程度为 UVM_HIGH
或更高时才会打印。换句话说,如果您想要打印消息,请将详细程度设置为较低级别。
顺便说一句:宏后不需要分号。