如何在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
相关产品推荐
相关产品推荐

