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

如何在子类中为基类coverpoint添加ignore_bins?扩展covergroup报错

在子类中为基类coverpoint添加ignore_bin的解决方法

问题根源

你之前使用covergroup cg_rand extends Base_class::cg;出现编译错误,是因为SystemVerilog中covergroup的继承语法需要遵循特定规则,且部分旧版仿真工具可能不完全支持标准语法。下面提供两种可行的实现方案:


方案一:使用标准covergroup继承(推荐)

该方案基于IEEE 1800-2012及以后的SystemVerilog标准,主流仿真工具(如Synopsys VCS、Cadence Xcelium)均支持。通过继承基类covergroup,保留原有bins并添加ignore_bin:

  1. 基类定义示例
class Base_class;
  rand int val;
  covergroup cg;
    coverpoint val {
      bins low = {[0:10]};
      bins high = {[11:20]};
    }
  endgroup

  function new();
    cg = new();
  endfunction
endclass
  1. 子类扩展实现
class Sub_class extends Base_class;
  // 正确继承基类covergroup
  covergroup cg extends Base_class::cg;
    // 重写val的coverpoint,保留基类原有bins并添加ignore_bin
    coverpoint val {
      use_default_bins; // 关键:保留基类定义的所有bins
      ignore_bins ignore_vals = {[5:7]}; // 添加需要忽略的数值范围
    }
  endgroup

  function new();
    super.new();
    cg = new(); // 实例化子类的covergroup,覆盖基类实例
  endfunction
endclass
  • use_default_bins关键字必须添加,否则会完全覆盖基类的coverpoint定义,丢失原有bins。

方案二:重定义covergroup(兼容旧工具)

如果你的仿真工具不支持covergroup继承,可以直接在子类中重新定义covergroup,复制基类的bins规则后添加ignore_bin:

class Sub_class extends Base_class;
  covergroup cg;
    coverpoint val {
      // 复制基类的bins定义
      bins low = {[0:10]};
      bins high = {[11:20]};
      // 添加ignore_bin
      ignore_bins ignore_vals = {[5:7]};
    }
  endgroup

  function new();
    super.new();
    cg = new();
  endfunction
endclass
  • 缺点:需要重复基类的bins代码,后续基类规则变更时需同步修改子类,维护成本较高。

注意事项

  • 确认仿真工具版本支持SystemVerilog 2012及以后标准,否则方案一无法生效。
  • 子类实例化时必须创建自己的covergroup对象,覆盖基类的cg实例,才能使新的ignore_bin规则生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:22:36