How to determine the size of a multi-dimensional dynamic array in a constraint?

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