Can we sample coverpoints which are design parameters?

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