如何在子类中为基类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:
- 基类定义示例
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
- 子类扩展实现
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
相关产品推荐
相关产品推荐

