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

如何在SystemVerilog类中正确实例化covergroup?

类中Covergroup的正确实例化方法

你遇到的报错是因为rd_size_cg是random_data_c类的内部嵌套类型,无法在module中直接当作全局类型声明变量。类内部定义的covergroup作用域仅限于类内部,必须通过类的对象或者类作用域解析符来访问。

以下是两种正确的实现方式:

方式一:在类构造函数中自动实例化Covergroup

这种方式最常用,确保类对象创建时,covergroup也随之实例化,自动关联类的成员变量。

修改后的完整代码:

class random_data_c;
                   
rand logic [7:0] height;
rand logic [7:0] width;
// 声明covergroup类型的成员变量
rd_size_cg cg_inst;

constraint arr_c { 
                  height inside {[0:5]};
                  width inside {[0:5]};
}                  
                   
covergroup rd_size_cg;    
  option.per_instance = 1;
rd_height : coverpoint height {
bins num[] = {[0:255]};   
illegal_bins ig[] = default;
    }              
                   
rd_width : coverpoint width {
bins num[] = {[0:255]};   
illegal_bins ig[] = default;
    }              
endgroup           

// 类构造函数中实例化covergroup
function new();
  cg_inst = new();
endfunction
                   
endclass           
                   
module test;
random_data_c rd;  
                   
initial begin      
  rd = new();  // 创建类对象时,covergroup也被自动实例化
  assert(randomize(rd));
  // 调用covergroup的采样方法
  rd.cg_inst.sample();
  $display("height:%h", rd.height);
  $display("width:%h", rd.width);
  // 原代码中rd.arr未定义,此处注释避免报错
  // foreach(rd.arr[i,j]) begin
  //   $display("arr[%d][%d]=%h", i,j,rd.arr[i][j]);
  // end              
end                
                   
endmodule

关键改动说明:

  • 在类内部声明rd_size_cg类型的成员变量cg_inst
  • 在类的new()构造函数中完成covergroup的实例化,保证类对象与covergroup的绑定
  • 在module中通过类对象rd访问covergroup,并调用sample()完成采样

方式二:在类外部通过类作用域解析符实例化Covergroup

如果需要手动控制covergroup的实例化时机,可以用这种方式,需明确指定covergroup的作用域:

修改后的完整代码:

class random_data_c;
                   
rand logic [7:0] height;
rand logic [7:0] width;

constraint arr_c { 
                  height inside {[0:5]};
                  width inside {[0:5]};
}                  
                   
covergroup rd_size_cg;    
  option.per_instance = 1;
rd_height : coverpoint height {
bins num[] = {[0:255]};   
illegal_bins ig[] = default;
    }              
                   
rd_width : coverpoint width {
bins num[] = {[0:255]};   
illegal_bins ig[] = default;
    }              
endgroup           
                   
endclass           
                   
module test;
random_data_c rd;  
// 通过类作用域解析符声明covergroup变量
random_data_c::rd_size_cg rd_size_cg_inst;
                   
initial begin      
  rd = new();      
  // 实例化covergroup时传入类对象,关联要采样的成员变量
  rd_size_cg_inst = new(rd);
  assert(randomize(rd));
  rd_size_cg_inst.sample();
  $display("height:%h", rd.height);
  $display("width:%h", rd.width);
end                
                   
endmodule

关键改动说明:

  • 在module中声明covergroup变量时,必须用类名::covergroup名指定作用域
  • 实例化covergroup时,传入类对象rd作为参数,让covergroup明确要采样的对象成员
  • 调用sample()方法完成变量采样

注意:原代码中rd.arr未在类中定义,编译时会触发额外报错,需注释或补充定义。

内容的提问来源于stack exchange,提问作者bu-ral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:53:29