In reply to vinod cheedella:
Thanks,
Your suggestion works for me - reproduced here, as I’d spotted a typo in your c_sgl_size constraint.
module top;
typedef byte sgl_t[][][16];
// Class
class myclass;
rand byte sgl[][][16];
rand byte unsigned payload[];
rand int unsigned payload_desc[];
rand int tmpArr[];
// Array creation
constraint c_sgl_size { sgl.size == 5;
tmpArr.size == sgl.size;
payload.size == 15;
foreach(sgl[i,,]) {
sgl[i].size == 2;
tmpArr[i] == sgl[i].size;
}
}
constraint C_PAYLOAD_DISTRIBUTION {
payload_desc.size == tmpArr.sum with (int'(item));
payload_desc.sum with (longint'(item)) == payload.size;
}
function void post_randomize();
$display("payload_desc size = %d ", payload_desc.size());
$display("sgl size = %d ", sgl.size());
foreach(sgl[i,]) begin
$display("sgl[%1d].size= %d ", i, sgl[i].size);
end
foreach(payload_desc[i]) begin
$display("payload_desc[%1d]= %d ", i, payload_desc[i]);
end
endfunction: post_randomize
endclass // myclass
initial
begin
myclass c;
c= new();
if(!c.randomize()) begin
$display("Randomize fail ");
end
else begin
$display("Randomize Pass");
end
end
endmodule // top;
Here is the output,
payload_desc size = 10
sgl size = 5
sgl[0].size= 2
sgl[1].size= 2
sgl[2].size= 2
sgl[3].size= 2
sgl[4].size= 2
payload_desc[0]= 12
payload_desc[1]= 1
payload_desc[2]= 1
payload_desc[3]= 1
payload_desc[4]= 0
payload_desc[5]= 0
payload_desc[6]= 0
payload_desc[7]= 0
payload_desc[8]= 0
payload_desc[9]= 0
Randomize Pass