In reply to Karmapanchal:
You can define parameter as cover point. You can refer to parameter with module instance path. Here are two ways to do this - one to implement the coverage model in the dut, one is to implement the coverage model in test bench.
typedef enum int {fast, slow, med} dutT;
module tb ();
dut #(2, slow) dut1();
dut #(3, med) dut2();
dut #(4, fast) dut3();
//way 1
covergroup cg_param with function sample (int mode, dutT dut_type);
option.per_instance = 1;
coverpoint mode;
coverpoint dut_type;
endgroup
cg_param cg_param_inst=new;
initial begin
$display("dut1.mode=%0d, dut1.dut_type=%0s",dut1.mode, dut1.dut_type.name());
$display("dut2.mode=%0d, dut2.dut_type=%0s",dut2.mode, dut2.dut_type.name());
$display("dut3.mode=%0d, dut3.dut_type=%0s",dut3.mode, dut3.dut_type.name());
//way 1 define the covergroup in tb
cg_param_inst.sample(dut1.mode, dut1.dut_type);
cg_param_inst.sample(dut2.mode, dut2.dut_type);
cg_param_inst.sample(dut3.mode, dut3.dut_type);
//way 2 define the covergroup in the dut
dut1.cg_param_inst.sample();
dut2.cg_param_inst.sample();
dut3.cg_param_inst.sample();
end
endmodule
module dut #(parameter int mode = 1, dutT dut_type = fast) ();
covergroup cg_param;
option.per_instance = 1;
coverpoint mode;
coverpoint dut_type;
endgroup
cg_param cg_param_inst=new;
endmodule
Log printed:
dut1.mode=2, dut1.dut_type=slow
dut2.mode=3, dut2.dut_type=med
dut3.mode=4, dut3.dut_type=fast