In reply to peter.r:
I have come up with this:
cp__dram_type : coverpoint dram_type_loc {
bins dram_tech[] = dram_type_loc_q;
}
cp__dram_freq : coverpoint dram_freq_loc {
bins dram_freq[] = dram_freq_loc_q;
}
cr_one_hot_x_dram_x_freq_x_type : cross cp__one_hot_vector, cp__dram_type, cp__dram_freq {
function CrossQueueType cr_func();
for(int i = 0; i<WIDTH; i++) begin
foreach(freq_arr[j]) begin
for(int k = 0; k < freq_arr[j].size(); k++) begin
cr_func.push_front('{i,j,freq_arr[j][k]});
end
end
end
endfunction
bins cr = cr_func();
}
endgroup // cg__one_hot
function new(string name="one_hot_x_dram_type_x_freq");
foreach(freq_arr[i]) begin
dram_type_loc_q.push_back(i);
for(int j = 0; j < freq_arr[i].size(); j++)
dram_freq_loc_q.push_back(freq_arr[i][j]);
end
cg__one_hot_x_dram = new();
endfunction // new
Printing the result of cr_func yields:
cr_func =
...
...
'{cp__one_hot_vector:2, cp__dram_type:eLPDDR4, cp__dram_freq:eDDR_FREQ_2133},
'{cp__one_hot_vector:2, cp__dram_type:eLPDDR4, cp__dram_freq:eDDR_FREQ_1467},
'{cp__one_hot_vector:2, cp__dram_type:eDDR4, cp__dram_freq:eDDR_FREQ_1067},
'{cp__one_hot_vector:2, cp__dram_type:eDDR4, cp__dram_freq:eDDR_FREQ_800},
'{cp__one_hot_vector:1, cp__dram_type:eLPDDR4, cp__dram_freq:eDDR_FREQ_2133},
'{cp__one_hot_vector:1, cp__dram_type:eLPDDR4, cp__dram_freq:eDDR_FREQ_1467},
'{cp__one_hot_vector:1, cp__dram_type:eDDR4, cp__dram_freq:eDDR_FREQ_1067},
'{cp__one_hot_vector:1, cp__dram_type:eDDR4, cp__dram_freq:eDDR_FREQ_800},
'{cp__one_hot_vector:0, cp__dram_type:eLPDDR4, cp__dram_freq:eDDR_FREQ_2133},
'{cp__one_hot_vector:0, cp__dram_type:eLPDDR4, cp__dram_freq:eDDR_FREQ_1467},
'{cp__one_hot_vector:0, cp__dram_type:eDDR4, cp__dram_freq:eDDR_FREQ_1067},
'{cp__one_hot_vector:0, cp__dram_type:eDDR4, cp__dram_freq:eDDR_FREQ_800}}
But cr has only one bin, and the remaining bins are listed in the coverage tool. I was expecting cr to have the bins I wanted, but it seems it behaving like ignore_bins.