covergroup定义在类外面:
covergroup cmd_fcov with function sample(svt_axi_transaction tr);
coverpoint tr.addr;
coverpoint tr.id;
coverpoint tr.data.size;
endgroup
class xx_refm extends uvm_refm;
cmd_fcov A_cov;
function new(string name = "psub_sdma_scb", uvm_component parent);
A_cov = new();
endfunction
//在具体的位置调用:A_cov.sample(axi_tr);
endclass
常用的方法:
在SystemVerilog中,`binsof`和`intersect`是用于处理位向量和集合的内建函数。
- `binsof`函数用于从一个位向量中提取1的位置,并将结果返回为一个集合。它的语法如下: ```systemverilog function integer binsof(input logic [N-1:0] vector); ``` 其中,`vector`是一个位向量,`N`代表位向量的宽度。`binsof`会遍历`vector`的每一位,并将值为1的索引添加到返回的集合中。例如,对于位向量`8'b11010011`,`binsof`会返回`{0, 3, 4, 6, 7}`。
- `intersect`函数用于计算两个集合的交集,并将结果返回为一个集合。它的语法如下: ```systemverilog function static integer intersect(input integer A[$], input integer B[$]); ``` 其中,`A`和`B`是两个集合。`intersect`会返回`A`和`B`的交集。例如,对于集合`{1, 2, 3, 4}`和`{3, 4, 5}`,`intersect`会返回`{3, 4}`。
在 SystemVerilog 中,`binsof` 和 `intersect` 是在功能覆盖率收集上使用的两个关键字。
`binsof` 用于在 `covergroup` 或 `coverpoint` 中获取已定义的覆盖率桶(coverage bin)的集合。通过使用 `binsof`,可以访问和操作覆盖率桶中的信息。
以下是 `binsof` 的示例用法: ```systemverilog
covergroup my_coverage;
coverpoint my_signal {
bins data = {0, 1, [2:5], 8};
bins edge = {posedge, negedge}; }
endgroup
function void my_function();
int my_bins[$];
my_bins = my_coverage.my_signal.binsof(data);
foreach (my_bins[i]) $display("Data bin: %0d", my_bins[i]);
// 获取与两个覆盖率桶相交的交集
my_bins = intersect(my_coverage.my_signal.binsof(data), my_coverage.my_signal.binsof(edge)); foreach (my_bins[i]) $display("Intersection bin: %0d", my_bins[i]);
endfunction
``` 在上述示例中,`my_coverage` 是一个 `covergroup`,其中包含了一个 `coverpoint` `my_signal`,它定义了两个覆盖率桶 `data` 和 `edge`。通过使用 `binsof`,可以获取名为 `data` 的覆盖率桶,并在 `my_function` 中进行操作和输出。 `intersect` 是一个函数,用于获取两个集合的交集。在上述示例中,`intersect` 函数用于获取 `data` 和 `edge` 这两个覆盖率桶集合的交集,并在 `my_function` 中进行操作和输出。 这些关键字和功能可以帮助开发人员在进行功能覆盖率分析时收集和处理相关数据。