How to disable automatically-generated cross bins?

There is no way to disable all “automatically-generated cross bins” like default in a coverpoint bin. Generally you are trying to collapse the set of individual automatically generated bins into larger bins.

To get a narrower set of cross bins, you have several options. My first suggestion would be to narrow the coverpoints in the cross. This would show your intent best.

int i,j;
covergroup ct;
  i0: coverpoint i { bins i = { 0 }; }
  i1: coverpoint i { bins i = { 1 }; }
  coverpoint j { bins j[] = { [0:1] }; }
  x1: cross i,j;
  x2: cross i0,j;
endgroup

The next suggestion would be to use ignore_bins. There are many different types of expressions in a cross bin, but for this simple example, you might use

int i,j;
covergroup ct;
  coverpoint i { bins i[] = { [0:1] }; }
  coverpoint j { bins j[] = { [0:1] }; }
  x1: cross i,j;
  x2: cross i,j {
    bins i_zero = binsof(i) intersect { 0 };
    ignore_bins ignore = ! binsof(i) intersect { 0 };
    }
endgroup


But this becomes more difficult to manage as you get more complicated crosses.