Tutorials

Learn More

The cross-coverage allows having a cross product (i.e. cartesian product) between two or more variables or coverage points within the same covergroup. In simple words, cross-coverage is nothing but a set of cross-products of variables or coverage points.

Syntax:

<cross_coverage_label> : cross <coverpoint_1>, <coverpoint_2>,..., <coverpoint_n>

Example:

bit [7:0] addr, data;
bit [3:0] valid;
bit en;

covergroup c_group @(posedge clk); 
  cp1: coverpoint addr && en; // labeled as cp1
  cp2: coverpoint data;       // labeled as cp2
  cp1_X_cp2: cross cp1, cp2; // cross coverage between two expressions
  valid_X_cp2: cross valid, cp2; // cross coverage between variable and expression
endgroup : c_group

Coverage constructs

iff construct

The expression within the iff construct provides feasibility to exclude the coverpoint in the coverage if an expression is evaluated as false.

Example:

module func_coverage;
  logic [3:0] addr; 

  covergroup c_group; 
    cp1: coverpoint addr iff(!reset_n) // coverpoint addr is covered when reset_n is low.
  endgroup

  c_group cg = new();
  ...
  ...
endmodule

binsof and intersect construct in functional coverage

binsof construct in coverage

The binsof construct is used to yield bins of its expression.

Syntax:

binsof (<expression>)

Where, 

An expression can be either a single variable or an explicitly defined coverage point.

Example:

bit [7:0] var1, var2;
covergroup c_group @(posedge clk);
  cp1: coverpoint var1 {
                         bins x1 = { [0:99] };
                         bins x2 = { [100:199] };
                         bins x3 = { [200:255] };
                       }

  cp2: coverpoint var2 {
                         bins y1 = { [0:74] };
                         bins y2 = { [75:149] };
                         bins y3 = { [150:255] };
                       }

  cp1_X_cp2: cross cp1, cp2 {
                         bins xy1 = binsof(cp1.x1);
                         bins xy2 = binsof(cp2.y2);
                         bins xy3 = binsof(cp1.x1) && binsof(cp2.y2);
                         bins xy4 = binsof(cp1.x1) || binsof(cp2.y2);
                       }
endgroup

In the above example, coverage points cp1 and cp2 include a set of cover bins for variables var1 and var2. The cp1_X_cp2 denotes the cross product of var1 and var2 with specified cross-bins.

If no additional cross bins were specified (i.e. cp1_X_cp2: cross var1, var2), then it would have resulted in 9 cross products listed as:

<x1, y1>, <x1, y2>, <x1, y3>,
<x2, y1>, <x2, y2>, <x2, y3>, 
<x3, y1>, <x3, y2>, <x3, y3>.

The cross bin xy1: It results in 3 cross products listed as

<x1, y1>, <x1, y2>, <x1, y3>

The cross bin xy2: It results in 3 cross products listed as

<x1, y2>, <x2, y2>, <x3, y2>

The cross bin xy3: It results in 1 cross-product listed as

<x1, y2>

The cross bin xy4: It results in 5 cross products listed as

<x1, y1>, <x1, y2>, <x1, y3>, <x2, y2>, <x3, y2>

intersect construct in coverage

The intersect construct is generally used in conjunction with the binsof construct which is used to exclude or include a set of values of bins that intersect a desired set of values.

Syntax:

binsof(<coverpoint>) intersect {<range of values>}

Meaning

bins

Description

binsof(cp) intersect {r}

The bins of coverpoint cp whose values intersect the range specified by r

!binsof(cp) intersect {r}

The bins of coverpoint cp whose values do not intersect the range specified by r

Example:

bit [7:0] var1, var2;
covergroup c_group @(posedge clk);
  cp1: coverpoint var1 {
                         bins x1 = { [0:99] };
                         bins x2 = { [100:199] };
                         bins x3 = { [200:255] };
                       }

  cp2: coverpoint var2 {
                         bins y1 = { [0:74] };
                         bins y2 = { [75:149] };
                         bins y3 = { [150:255] };
                       }

  cp1_X_cp2: cross cp1, cp2 {
                         bins xy1 = binsof(cp1) intersect {[100:200]};
                         bins xy2 = !binsof(cp1) intersect {[100:200]};
                         bins xy3 = !binsof(cp1) intersect {99, 125, 150, 175};
                       }
endgroup

In the above example, coverage points cp1 and cp2 include a set of cover bins for variables var1 and var2. The cp1_X_cp2 denotes the cross product of var1 and var2 with specified cross-bins.

If no additional cross bins were specified (i.e. cp1_X_cp2: cross var1, var2), then it would have resulted in 9 cross products listed as:

<x1, y1>, <x1, y2>, <x1, y3>,
<x2, y1>, <x2, y2>, <x2, y3>, 
<x3, y1>, <x3, y2>, <x3, y3>.

The cross bin xy1: The x2 and x3 of cp1 intersect with value range [100:200]. It results in 6 cross products listed as

<x2, y1>, <x2, y2>, <x2, y3>,
<x3, y1>, <x3, y2>, <x3, y3>.

The cross bin xy2: The x1 alone do not intersect the value range [100:200]. It results in 3 cross products listed as

<x1, y1>, <x1, y2>, <x1, y3>

The cross bin xy3: The x3 alone do not intersect with range of values 99, 125, 150, 175. It results in 3 cross products listed as

<x3, y1>, <x3, y2>, <x3, y3>

Excluding cross product using ignore_bins and illegal_bins construct

In the above example, cross-product bins can be excluded as

 cp1_X_cp2: cross cp1, cp2 {
           ignore_bins xy1 = binsof(cp1) intersect {[100:200]};
           ignore_bins xy2 = !binsof(cp1) intersect {[100:200]};
           ignore_bins xy3 = !binsof(cp1) intersect {99, 125, 150, 175};
          }

The cross bin xy1: It results into exclusion of 6 cross products listed as

<x2, y1>, <x2, y2>, <x2, y3>,
<x3, y1>, <x3, y2>, <x3, y3>.

The cross bin xy2: It results in the exclusion of 3 cross products listed as

<x1, y1>, <x1, y2>, <x1, y3>

The cross bin xy3: It results in the exclusion of 3 cross products listed as

<x3, y1>, <x3, y2>, <x3, y3>

Similarly, illegal bins can also be specified as

cp1_X_cp2: cross cp1, cp2 {
           illegal_bins xy1 = binsof(cp1) intersect {[100:150]};
           illegal_bins xy2 = !binsof(cp1) intersect {[100:150]};
           illegal_bins xy3 = !binsof(cp1) intersect {99, 125, 150, 175};
          }