Search code examples
verilogsystem-verilog

Pass 2D real array to a function in System Verilog


I am trying to pass 2D real array to an SV function and return the same but I'm not able to execute this task successfully. Here is a simple reproducible code:

module Two_d_array_pass();

real x[2][2]='{'{1.0,2.0},'{3.0,4.0}};
real y[2][2]='{'{2.0,2.0},'{2.0,2.0}};
real z[2][2];
int i,j;

initial begin
    foreach(x[i,j]) $display("x[%0d][%0d]=%0f",i,j,x[i][j]);
    foreach(y[i,j]) $display("y[%0d][%0d]=%0f",i,j,y[i][j]);
    z=mult(x,y);
end

function real mult(x,y);
    real c[2][2];
    int i,j;    
    foreach(c[i,j]) 
        c[i][j]=x[i][j]*y[i][j];
    return c;
endfunction

endmodule

and here is the error I get:

file: Two_d_array_pass.sv
                c[i][j]=x[i][j]*y[i][j];
                        |
xmvlog: *E,DIMERR (Two_d_array_pass.sv,18|10): Bit-select or part-select dimensions do not match declaration.
                c[i][j]=x[i][j]*y[i][j];
                                |
xmvlog: *E,DIMERR (Two_d_array_pass.sv,18|18): Bit-select or part-select dimensions do not match declaration.

Can anyone correct the code to achieve this task?


Solution

  • You need to change the arguments to be 2x2 dimensional as well.

    function real mult(real x[2][2],y[2][2]);
    

    But you also need to do it for the return type, but because of syntax limitations, unpacked array need a typedef for the return type.

    typedef real real2x2[2][2];
    function real2x2 mult(real x[2][2],y[2][2]);
    

    Then you might as well use the typedef everywhere

    module Two_d_array_pass();
      typedef real real2x2[2][2];
      real2x2 x='{'{1.0,2.0},'{3.0,4.0}};
      real2x2 y='{'{2.0,2.0},'{2.0,2.0}};
      real2x2 z;
    
    initial begin
        foreach(x[i,j]) $display("x[%0d][%0d]=%0f",i,j,x[i][j]);
        foreach(y[i,j]) $display("y[%0d][%0d]=%0f",i,j,y[i][j]);
        z=mult(x,y);
    end
    
      function real2x2 mult(real2x2 x,y);  
        foreach(x[i,j]) 
            mult[i][j]=x[i][j]*y[i][j];
      endfunction
    
    endmodule
    

    P.S. you do not declare the iterating variables i and j separately, they are implicit and local to the scope of the foreach statement. If you declare them separately, they become extra variables unused by the foreach loop.