You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SystemVerilog中能否为交叉覆盖率的每个交叉乘积创建独立bin?

实现交叉覆盖率的精细化独立Bin

当然可以做到!你想要的是针对cp_a.a1对应的每个cp_b取值,在交叉覆盖率中创建独立的统计Bin,而不是把所有b值打包成一个大Bin。下面给你两种实用的实现方式:

方法1:手动指定每个交叉Bin

如果你的cp_b的取值范围不大,可以直接手动为每个a=1+b=x的组合创建Bin:

cr : cross cp_a, cp_b {
  // 为a=1时的每个b值创建独立Bin
  bins a1_b0 = binsof(cp_a.a1) && binsof(cp_b.b[0]);
  bins a1_b1 = binsof(cp_a.a1) && binsof(cp_b.b[1]);
  bins a1_b2 = binsof(cp_a.a1) && binsof(cp_b.b[2]);
  // ... 依次类推到 bins a1_b10 = binsof(cp_a.a1) && binsof(cp_b.b[10]);

  // 其他a值的交叉Bin可以保留原有方式,或者同样拆分
  bins a2 = binsof(cp_a.a2);
  bins a3 = binsof(cp_a.a3);
}

方法2:用foreach循环自动生成Bin

如果cp_b的Bin数量较多,手动写太繁琐,可以用SystemVerilog的foreach循环自动遍历cp_b的所有Bin,批量生成交叉Bin:

cr : cross cp_a, cp_b {
  // 自动遍历cp_b的所有Bin,为a=1的每个交叉组合创建独立Bin
  foreach (cp_b.b[i]) begin
    bins a1_b[i] = binsof(cp_a.a1) && binsof(cp_b.b[i]);
  end

  // 如需对a2、a3也做同样拆分,只需复制foreach块并修改cp_a的Bin即可
  // foreach (cp_b.b[i]) begin
  //   bins a2_b[i] = binsof(cp_a.a2) && binsof(cp_b.b[i]);
  // end

  bins a2 = binsof(cp_a.a2);
  bins a3 = binsof(cp_a.a3);
}

关键说明

  • binsof(cp_a.a1) && binsof(cp_b.b[i])的作用是精准匹配同时满足cp_a取a1、cp_b取第i个Bin值的交叉情况,每个这样的组合都会生成一个独立的覆盖率统计项。
  • 这种语法符合SystemVerilog IEEE 1800标准,主流仿真器(如VCS、QuestaSim)都支持。
  • 你提到的bins b [] = {[0:10]}是coverpoint的自动Bin生成,交叉覆盖率中虽然不能直接用这种语法,但通过binsof结合逻辑与(&&)的方式,就能实现等价的精细化Bin划分。

内容的提问来源于stack exchange,提问作者Eivind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:57:49