System verilog 非法_bin声明中的条件如何解释?

System verilog 非法_bin声明中的条件如何解释?,system-verilog,System Verilog,如何处理非法_bin声明中的条件?或者它们一开始就有效吗?在我看来,ILLALLALY-BIN声明不考虑容器覆盖范围内的任何条件。 i、 e 与 illegal_bins invalid_1 = {[0:7]}; 非法_bin的目的是,每当base为1600且basediv为2时,coverpoint表达式[0:7]内的任何值都不是有效值 除了使用交叉和垃圾桶外,是否有其他方法对非法垃圾桶进行编码。。。相交路 下面是示例代码 class base_cfg; // Divider Valu

如何处理非法_bin声明中的条件?或者它们一开始就有效吗?在我看来,ILLALLALY-BIN声明不考虑容器覆盖范围内的任何条件。 i、 e

illegal_bins invalid_1 = {[0:7]};
非法_bin
的目的是,每当base为1600且basediv为2时,coverpoint表达式[0:7]内的任何值都不是有效值

除了使用
交叉
垃圾桶外,是否有其他方法对
非法垃圾桶
进行编码。。。相交

下面是示例代码

class base_cfg;

  // Divider Values
  rand struct {
    rand bit [ 1: 0] BaseDiv1;
    rand bit [ 2: 0] BaseDiv2;
    rand bit         BaseDiv3;
    rand bit         BaseDiv4;
  } s_basediv;

  rand int BaseVal;


  constraint c_BaseX {
    BaseVal inside {1600, 1400, 1200, 1000, 800};
  }

  constraint c_basediv {
    s_basediv.BaseDiv1      inside {[0: 3]};
    s_basediv.BaseDiv2      inside {[0: 7]};
    s_basediv.BaseDiv3      inside {[0: 1]};
    s_basediv.BaseDiv4      inside {[0: 1]};


    if (BaseVal == 1600) { s_basediv.BaseDiv1 inside {[0:3]}; }
    if (BaseVal == 1400) { s_basediv.BaseDiv1 inside {[0:2]}; }
    if (BaseVal == 1200) { s_basediv.BaseDiv1 inside {[0:2]}; }
    if (BaseVal == 1000) { s_basediv.BaseDiv1 inside {[0:2]}; }
    if (BaseVal == 800 ) { s_basediv.BaseDiv1 inside {[0:2]}; }

    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:3]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv2 inside {[0:1]}; }

    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:6]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:2]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv2 inside {[0:6]}; }

    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:5]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:2]}; }

    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:4]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:3]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:1]}; }

    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv3 inside {[0:0]}; }

    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:1]}; }

    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:1]}; }

    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:0]}; }

    if (BaseVal == 800  && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:0]}; }

    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:1]}; }

    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

    if (BaseVal == 800  && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

  }


  function void post_randomize();
    $display($psprintf("BaseVal     = %d", BaseVal));
    $display($psprintf("BaseDiv1    = %d", s_basediv.BaseDiv1));
    $display($psprintf("BaseDiv2    = %d", s_basediv.BaseDiv2));
    $display($psprintf("BaseDiv3    = %d", s_basediv.BaseDiv3));
    $display($psprintf("BaseDiv4    = %d", s_basediv.BaseDiv4));
    $display($psprintf("----------------------------------"));
  endfunction: post_randomize

endclass: base_cfg

class base_cov;


  covergroup base_cg (string name, ref base_cfg   p_base_cfg);

    option.per_instance = 1;
    option.name         = name;
    option.comment      = $sformatf("covergroup for covering ccr clocks");

    BaseVal_cp:      coverpoint p_base_cfg.BaseVal {
                       bins valid[]     = { 1600, 1400, 1200, 1000, 800 };
                       bins default_val = default;
                     }


    BaseDiv1_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv1  {
                        bins valid[] = {[0:3]};
                      }  


    BaseDiv2_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv2 {
                       bins valid_1600_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1600_1[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1600_2[] = {[0:7]} with ( (item inside {[0:3]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1600_3[] = {[0:7]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1400_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1400_1[] = {[0:7]} with ( (item inside {[0:6]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1400_2[] = {[0:7]} with ( (item inside {[0:2]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1400_3[] = {[0:7]} with ( (item inside {[0:6]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1200_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1200_1[] = {[0:7]} with ( (item inside {[0:5]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1200_2[] = {[0:7]} with ( (item inside {[0:2]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_1000_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1000_1[] = {[0:7]} with ( (item inside {[0:4]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1000_2[] = {[0:7]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_800_0[]  = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_800_1[]  = {[0:7]} with ( (item inside {[0:3]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_800_2[]  = {[0:7]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       illegal_bins invalid_1600_2 = {[0:7]} with ( (item inside {[4:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1600_3 = {[0:7]} with ( (item inside {[2:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1400_1 = {[0:7]} with ( (item inside {[7:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_1400_2 = {[0:7]} with ( (item inside {[3:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1400_3 = {[0:7]} with ( (item inside {[7:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1200_1 = {[0:7]} with ( (item inside {[6:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_1200_2 = {[0:7]} with ( (item inside {[3:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1200_3 = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1000_1 = {[0:7]} with ( (item inside {[5:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_1000_2 = {[0:7]} with ( (item inside {[2:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1000_3 = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_800_1  = {[0:7]} with ( (item inside {[4:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_800_2  = {[0:7]} with ( (item inside {[2:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_800_3  = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);
                     }

    BaseDiv3_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv3 {
                       bins valid_1600_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1600_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1600_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1600_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1400_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1400_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1400_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_1200_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1200_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1200_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_1000_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1000_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1000_2[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_800_0[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_800_1[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_800_2[]  = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       illegal_bins invalid_1600_0 = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1400_1 = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1200_2 = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1000_2 = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1000_3 = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_800_2  = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_800_3  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);
                     }

    BaseDiv4_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv4 {
                       bins valid_1600_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1600_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1600_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1600_3[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1400_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1400_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1400_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1400_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1200_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1200_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1200_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1200_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1000_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1000_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1000_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1000_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_800_0[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_800_1[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_800_2[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_800_3[]  = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1600_0 = {[0:0]} iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);

                       illegal_bins invalid_1400_3 = {[1:1]} iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1200_0 = {[0:0]} iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       illegal_bins invalid_1200_3 = {[1:1]} iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1000_0 = {[0:0]} iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       illegal_bins invalid_1000_3 = {[1:1]} iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_800_3  = {[1:1]} iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);
                     }
  endgroup: base_cg

  function new (ref base_cfg base_cfg_h);
    base_cg  = new($sformatf("base_cg"), base_cfg_h);
  endfunction: new 

endclass: base_cov

class base_env;
  rand base_cfg m_base_cfg;
  base_cov m_base_cov;

  function new ();
    m_base_cfg = new();
    m_base_cov = new(m_base_cfg);
  endfunction: new 

endclass: base_env

module top;

  base_env env;

  initial begin
    int count;
    env = new();
    for (int i=0; i<4; i++) begin
      for (int j=0; j<8; j++) begin
        $display("\n\ncount = %0d, i = %0d, j = %0d", count, i, j);
        $display($psprintf(".................................."));
        if (!env.randomize() with {m_base_cfg.s_basediv.BaseDiv1 == i;}) begin
          $error("env.randomize() with {m_base_cfg.s_basediv.BaseDiv1 == %0d;}", i);
        end
        #1;
        env.m_base_cov.base_cg.sample();
        #1;
        count ++;
      end
    end
  end

endmodule: top
class-base\u-cfg;
//除法器值
兰德结构{
rand位[1:0]BaseDiv1;
rand位[2:0]BaseDiv2;
rand位BaseDiv3;
rand位BaseDiv4;
}s_basediv;
兰特·内特·巴塞瓦尔;
约束c_BaseX{
BaseVal内部{1600、1400、1200、1000、800};
}
约束c_basediv{
{[0:3]}内的s_basediv.BaseDiv1;
{[0:7]}内的s_basediv.BaseDiv2;
{[0:1]}内的s_basediv.BaseDiv3;
{[0:1]}内的s_basediv.BaseDiv4;
如果(BaseVal==1600){[0:3]}内的{s_basediv.BaseDiv1;}
如果(BaseVal==1400){[0:2]}内的{s_basediv.BaseDiv1;}
如果(BaseVal==1200){[0:2]}内的{s_basediv.BaseDiv1;}
如果(BaseVal==1000){[0:2]}内的{s_basediv.BaseDiv1;}
如果(BaseVal==800){[0:2]}内的{s_basediv.BaseDiv1;}
如果(BaseVal==1600&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv2在{[0:7]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv2在{[0:7]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv2在{[0:3]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv2在{[0:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv2在{[0:7]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv2在{[0:6]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv2在{[0:2]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv2在{[0:6]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv2在{[0:7]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv2在{[0:5]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv2在{[0:2]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv2在{[0:7]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv2在{[0:4]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv2在{[0:1]};}
如果(BaseVal==800&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv2在{[0:7]};}
如果(BaseVal==800&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv2在{[0:3]};}
如果(BaseVal==800&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv2在{[0:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv3在{[0:0]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv3在{[0:0]};}
如果(BaseVal==800&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==800&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv3在{[0:1]};}
如果(BaseVal==800&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv3在{[0:0]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv4在{[1:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1600&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv4在{[1:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1400&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv4在{[0:0]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv4在{[1:1]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1200&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv4在{[0:0]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==0){s_basediv.BaseDiv4在{[1:1]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==1){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==2){s_basediv.BaseDiv4在{[0:1]};}
如果(BaseVal==1000&&s_basediv.BaseDiv1==3){s_basediv.BaseDiv4在{[0:0]};}
如果(BaseVal==800&&s_ba
class base_cfg;

  // Divider Values
  rand struct {
    rand bit [ 1: 0] BaseDiv1;
    rand bit [ 2: 0] BaseDiv2;
    rand bit         BaseDiv3;
    rand bit         BaseDiv4;
  } s_basediv;

  rand int BaseVal;


  constraint c_BaseX {
    BaseVal inside {1600, 1400, 1200, 1000, 800};
  }

  constraint c_basediv {
    s_basediv.BaseDiv1      inside {[0: 3]};
    s_basediv.BaseDiv2      inside {[0: 7]};
    s_basediv.BaseDiv3      inside {[0: 1]};
    s_basediv.BaseDiv4      inside {[0: 1]};


    if (BaseVal == 1600) { s_basediv.BaseDiv1 inside {[0:3]}; }
    if (BaseVal == 1400) { s_basediv.BaseDiv1 inside {[0:2]}; }
    if (BaseVal == 1200) { s_basediv.BaseDiv1 inside {[0:2]}; }
    if (BaseVal == 1000) { s_basediv.BaseDiv1 inside {[0:2]}; }
    if (BaseVal == 800 ) { s_basediv.BaseDiv1 inside {[0:2]}; }

    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:3]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv2 inside {[0:1]}; }

    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:6]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:2]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv2 inside {[0:6]}; }

    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:5]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:2]}; }

    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:4]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv2 inside {[0:7]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv2 inside {[0:3]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv2 inside {[0:1]}; }

    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv3 inside {[0:0]}; }

    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:1]}; }

    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:1]}; }

    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:0]}; }

    if (BaseVal == 800  && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv3 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv3 inside {[0:0]}; }

    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1600 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:1]}; }

    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1400 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1200 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[1:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 1000 && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

    if (BaseVal == 800  && s_basediv.BaseDiv1 == 0) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 1) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 2) { s_basediv.BaseDiv4 inside {[0:1]}; }
    if (BaseVal == 800  && s_basediv.BaseDiv1 == 3) { s_basediv.BaseDiv4 inside {[0:0]}; }

  }


  function void post_randomize();
    $display($psprintf("BaseVal     = %d", BaseVal));
    $display($psprintf("BaseDiv1    = %d", s_basediv.BaseDiv1));
    $display($psprintf("BaseDiv2    = %d", s_basediv.BaseDiv2));
    $display($psprintf("BaseDiv3    = %d", s_basediv.BaseDiv3));
    $display($psprintf("BaseDiv4    = %d", s_basediv.BaseDiv4));
    $display($psprintf("----------------------------------"));
  endfunction: post_randomize

endclass: base_cfg

class base_cov;


  covergroup base_cg (string name, ref base_cfg   p_base_cfg);

    option.per_instance = 1;
    option.name         = name;
    option.comment      = $sformatf("covergroup for covering ccr clocks");

    BaseVal_cp:      coverpoint p_base_cfg.BaseVal {
                       bins valid[]     = { 1600, 1400, 1200, 1000, 800 };
                       bins default_val = default;
                     }


    BaseDiv1_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv1  {
                        bins valid[] = {[0:3]};
                      }  


    BaseDiv2_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv2 {
                       bins valid_1600_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1600_1[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1600_2[] = {[0:7]} with ( (item inside {[0:3]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1600_3[] = {[0:7]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1400_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1400_1[] = {[0:7]} with ( (item inside {[0:6]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1400_2[] = {[0:7]} with ( (item inside {[0:2]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1400_3[] = {[0:7]} with ( (item inside {[0:6]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1200_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1200_1[] = {[0:7]} with ( (item inside {[0:5]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1200_2[] = {[0:7]} with ( (item inside {[0:2]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_1000_0[] = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1000_1[] = {[0:7]} with ( (item inside {[0:4]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1000_2[] = {[0:7]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_800_0[]  = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_800_1[]  = {[0:7]} with ( (item inside {[0:3]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_800_2[]  = {[0:7]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       illegal_bins invalid_1600_2 = {[0:7]} with ( (item inside {[4:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1600_3 = {[0:7]} with ( (item inside {[2:7]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1400_1 = {[0:7]} with ( (item inside {[7:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_1400_2 = {[0:7]} with ( (item inside {[3:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1400_3 = {[0:7]} with ( (item inside {[7:7]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1200_1 = {[0:7]} with ( (item inside {[6:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_1200_2 = {[0:7]} with ( (item inside {[3:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1200_3 = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1000_1 = {[0:7]} with ( (item inside {[5:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_1000_2 = {[0:7]} with ( (item inside {[2:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1000_3 = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_800_1  = {[0:7]} with ( (item inside {[4:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       illegal_bins invalid_800_2  = {[0:7]} with ( (item inside {[2:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_800_3  = {[0:7]} with ( (item inside {[0:7]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);
                     }

    BaseDiv3_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv3 {
                       bins valid_1600_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1600_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1600_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1600_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1400_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1400_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1400_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_1200_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1200_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1200_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_1000_0[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1000_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1000_2[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       bins valid_800_0[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_800_1[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_800_2[]  = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);

                       illegal_bins invalid_1600_0 = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1400_1 = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1200_2 = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1000_2 = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_1000_3 = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_800_2  = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       illegal_bins invalid_800_3  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);
                     }

    BaseDiv4_cp:     coverpoint p_base_cfg.s_basediv.BaseDiv4 {
                       bins valid_1600_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1600_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1600_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1600_3[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1400_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1400_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1400_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1400_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1200_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1200_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1200_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1200_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_1000_0[] = {[0:1]} with ( (item inside {[1:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_1000_1[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_1000_2[] = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_1000_3[] = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       bins valid_800_0[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       bins valid_800_1[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 1);
                       bins valid_800_2[]  = {[0:1]} with ( (item inside {[0:1]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 2);
                       bins valid_800_3[]  = {[0:1]} with ( (item inside {[0:0]}) ) iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1600_0 = {[0:0]} iff (p_base_cfg.BaseVal == 1600 && p_base_cfg.s_basediv.BaseDiv1 == 0);

                       illegal_bins invalid_1400_3 = {[1:1]} iff (p_base_cfg.BaseVal == 1400 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1200_0 = {[0:0]} iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       illegal_bins invalid_1200_3 = {[1:1]} iff (p_base_cfg.BaseVal == 1200 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_1000_0 = {[0:0]} iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 0);
                       illegal_bins invalid_1000_3 = {[1:1]} iff (p_base_cfg.BaseVal == 1000 && p_base_cfg.s_basediv.BaseDiv1 == 3);

                       illegal_bins invalid_800_3  = {[1:1]} iff (p_base_cfg.BaseVal == 800  && p_base_cfg.s_basediv.BaseDiv1 == 3);
                     }
  endgroup: base_cg

  function new (ref base_cfg base_cfg_h);
    base_cg  = new($sformatf("base_cg"), base_cfg_h);
  endfunction: new 

endclass: base_cov

class base_env;
  rand base_cfg m_base_cfg;
  base_cov m_base_cov;

  function new ();
    m_base_cfg = new();
    m_base_cov = new(m_base_cfg);
  endfunction: new 

endclass: base_env

module top;

  base_env env;

  initial begin
    int count;
    env = new();
    for (int i=0; i<4; i++) begin
      for (int j=0; j<8; j++) begin
        $display("\n\ncount = %0d, i = %0d, j = %0d", count, i, j);
        $display($psprintf(".................................."));
        if (!env.randomize() with {m_base_cfg.s_basediv.BaseDiv1 == i;}) begin
          $error("env.randomize() with {m_base_cfg.s_basediv.BaseDiv1 == %0d;}", i);
        end
        #1;
        env.m_base_cov.base_cg.sample();
        #1;
        count ++;
      end
    end
  end

endmodule: top