【sv】功能覆盖率

本文详细介绍了SystemVerilog中的功能覆盖率,包括自动建仓收集不同类型的变量、忽略特定bins、交叉覆盖以及covergroup的多例化。通过示例展示了如何使用结构体和$typename()、$bits()等内置函数提升覆盖率报告的可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能覆盖率的一些写法,过程记录......

1. 自动建仓,收集 enum类型的变量 (自动建仓的名字可读性较好)

xxx_cp:coverpoint xxx_enum'(xxx);

2. 自动建仓,收集不连续的值

xxx_cp:coverpoint xxx iff (xxx inside {32'h0102????}) {
  wildcard bins xxx_bins[] = {32'h0102????} with (item inside {xxx_q}); //xxx_q 为一些离散的值,checker,激励等其他部分可以共用
}

3. 自动建仓,收集一些特殊值

xxx_cp:coverpoint xxx {
  bins all[] = xxx_cp with($onehot(item));
  bins mod3[] = xxx_cp with(item % 3 == 0);
}

4. ignore bins

xxx_cp:coverpoint xxx {
  bins all[] = {[1:10]};
}
yyy_cp:coverpoint xxx {
  bins all[] = {[1:20]} iff(cond==1);
}
cs_xxx_yyy:cross xxx_cp, yyy_cp {
  ignore_bins ig1 = binsof(xxx_cp) intersect{2} && !binsof(yyy_cp) intersect{[3:6]};
  ignore_bins xxx_eq_yyy = binsof(xxx_cp) with (xxx_cp == yyy_cp);
  //ignore_bins xxxmod = binsof(xxx_cp) with(xxx_cp % 3 == 0) && binsof(yyy_cp) intersect{3} iff(cond==1); //待确认
  ignore_bins xxxmod = binsof(xxx_cp) with(xxx_cp % 3 == 0) iff(cond==1);
}

5.cross(正向bins,而不是去ignore)

cs_xxx_yyy:cross xxx_cp, yyy_cp {

  option.cross_auto_bin_max=0;

  bins cs1 = binsof(xxx_cp) intersect{2} && !binsof(yyy_cp) intersect{[3:6]};

  bins cs2 = binsof(xxx_cp) with (xxx_cp == yyy_cp);

}

6. cp中使用函数返回值

xxx_cp:coverpoint xxx_func() {
  bins all[] = {[1:10]};
}

7. covergroup的多例化 (TODO:后续补充注释)

`define pack_s(name_s,   t0=logic[666:666], d0=d0,   t1=logic[666:666], d1=d1,  t2=logic[666:666], d2=d2,  t3=logic[666:666], d3=d3,  t4=logic[666:666], d4=d4,  t5=logic[666:666], d5=d5,  t6=logic[666:666], d6=d6,  t7=logic[666:666], d7=d7,  t8=logic[666:666], d8=d8,  t9=logic[666:666], d9=d9) \
 \
typedef struct packed { \
  t9 d9; \
  t8 d8; \
  t7 d7; \
  t6 d6; \
  t5 d5; \
  t4 d4; \
  t3 d3; \
  t2 d2; \
  t1 
功能覆盖率是验证过程中用于衡量测试用例覆盖设计功能的一个指标。通过功能覆盖率,可以确定测试是否充分覆盖了设计的所有功能点。以下是一个简单的SystemVerilog(SV功能覆盖率代码示例: ```systemverilog module fifo_coverage; // 定义覆盖组 covergroup fifo_cg @(posedge clk); // 覆盖项:fifo 空状态 empty_cp: coverpoint fifo_empty { bins empty = {1}; bins not_empty = {0}; } // 覆盖项:fifo 满状态 full_cp: coverpoint fifo_full { bins full = {1}; bins not_full = {0}; } // 覆盖项:fifo 数据入 write_cp: coverpoint write_data { bins write_data_bins = {[0:255]}; } // 覆盖项:fifo 数据读取 read_cp: coverpoint read_data { bins read_data_bins = {[0:255]}; } // 交叉覆盖:空状态与入操作 cross_empty_write: cross empty_cp, write_cp; // 交叉覆盖:满状态与读取操作 cross_full_read: cross full_cp, read_cp; endgroup // 实例化覆盖组 fifo_cg cg_inst = new(); // 假设有信号 fifo_empty, fifo_full, write_data, read_data 和 clk logic fifo_empty; logic fifo_full; logic [7:0] write_data; logic [7:0] read_data; logic clk; initial begin // 初始化信号 fifo_empty = 1; fifo_full = 0; write_data = 0; read_data = 0; clk = 0; // 简单的测试序列 repeat (10) begin @(negedge clk); write_data = $random; fifo_empty = 0; @(posedge clk); end repeat (10) begin @(negedge clk); read_data = $random; fifo_full = 0; @(posedge clk); end // 结束仿真 $finish; end // 时钟生成 always #5 clk = ~clk; endmodule ``` 在这个示例中,我们定义了一个覆盖组 `fifo_cg`,其中包含了对 FIFO 空状态、满状态、数据入和读取的覆盖项。还定义了两个交叉覆盖项,用于检查空状态与入操作、满状态与读取操作的组合情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值