sv 功能覆盖率

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` 中进行操作和输出。 这些关键字和功能可以帮助开发人员在进行功能覆盖率分析时收集和处理相关数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SV(SystemVerilog)中,覆盖率(coverage)是用来衡量验证测试的有效性的一种度量指标。它可以帮助验证工程师确定测试是否充分覆盖了设计中的各个功能或语句。 通常情况下,覆盖率是基于特定的覆盖模型来定义的,这个模型描述了设计中需要被覆盖的特定条件或情况。在SV中,你可以使用通配符(wildcard)来进行覆盖率的定义和匹配。 在覆盖模型中,通配符可以用来表示一组可能的取值。例如,你可以使用通配符'?'来匹配一个比特位的任意取值,使用'*'来匹配多个比特位的任意取值。这样,你可以定义一个通配符模式,来捕捉多个情况的覆盖。 下面是一个示例,展示了如何在SV中使用通配符来定义覆盖率: ```systemverilog // 定义一个覆盖模型 covergroup my_covergroup; coverpoint signal_a with wildcard @(posedge clk) { bins wildcard_bin = {1'b?}; } endgroup // 实例化覆盖模型 my_covergroup cg = new(); // 触发覆盖率采样 always @(posedge clk) begin cg.sample(signal_a); end ``` 在上面的示例中,我们定义了一个名为`my_covergroup`的覆盖模型,并在其中使用了通配符`?`来匹配`signal_a`信号的任意取值。当信号`signal_a`在时钟上升沿触发时,我们通过调用`cg.sample(signal_a)`来采样覆盖率。 通过这种方式,你可以灵活地定义和匹配覆盖率条件,以评估测试的覆盖程度是否满足需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值