I have a covergroup something like this
covergroup cover_routers with function sample(bit inj_val,eje_val);
option.per_instance = 1;
inj_val_cp : coverpoint inj_val
{
bins inject_valid[] = {[0:1]};
}
eje_val_cp : coverpoint eje_val
{
bins eject_valid[] = {[0:1]};
}
endgroup
Below I have multi dimentional dynamic array instance of the covergroup. Since it is a 8x4 array, so there will be 32 instances of the covergroup cov_routers but I want to exclude certain instances based on values of i and j, where i and j are two dimensions of the array, If I don’t do so, it shows holes in covergroup instances in verdi
For some values of i and j, I dont want coverage i.e just for example for the following instances of covergroups I don’t want coverage,
cov_routers[2][0]; cov_routers[2][1], cov_routers[2][2], cov_routers[7][3] and cov_routers[7][2]
I don’t want to sample them so I tried doing something like following:
class my_cov extends ovm_component;
`ovm_component_utils_begin(my_cov)
`ovm_component_utils_end
cover_routers cov_routers[][];// ixj= 8x4 array
function new(input string name = "my_cov", ovm_component parent = null);
super.new(name,parent);
endfunction
function void build();
super.build();
cov_routers = new[8];
foreach(cov_routers[i])
begin
if (i==2)
cov_routers[i] = new[1]; // since i want coverage only for 1 instance cov_routers[2][3]
else if (i==7)
cov_routers[i] = new[2];// since i want cov only for cov_routers[7][0] & cov_routers[7][1]
else
cov_routers[i] = new[4];
end
for (int i=0; i<8; i++)
begin
for (int j=0; j<4; j++)
begin
if (((i==2) && (j ==0))||((i==2) && (j ==1))||((i==2) && (j ==2))||((i==7)&&(j==3))||((i==7)&&(j==2))
begin
//do nothing
end
else
begin
cov_routers[i][j] =new;
end
end
end
task run();
super.run();
fork
router_coverage();
join
endtask
task automatic router_coverage();
for (int p=0; p<8; p++)
begin
automatic int i=p;
for (int q=0; q<4; q++)
begin
automatic int j=q;
if (((i==2) && (j ==0))||((i==2) && (j ==1))||((i==2) && (j ==2))||((i==7)&&(j==3))||((i==7)&&(j==2))
begin
// do nothing
end
else
begin
fork
begin
router_c(i,j)
end
join_none
end
endtask
task automatic router_c(int i, int j);
forever
begin
.....waiting for clock
.....sampling coverpoints inj_val and eje_val through proprietary fns
cov_routers[i][j].sample(inj_val, eje_val)
end
endtask
but when I do sampling of following instance in run task, it gives the error below
cov_routers[2][3].sample(....)
Error-[NOA] Null object access The object is being used before it was constructed/allocated. Please make sure that the object is allocated before using it.
Please help me with what I am doing wrong here or is there any other easier way of ignoring coverage for certain instances of covergroups, I will be very grateful