【问题标题】:Pass 2D real array to a function in System Verilog将二维实数组传递给 System Verilog 中的函数
【发布时间】:2021-05-19 16:49:36
【问题描述】:

我正在尝试将 2D 实数数组传递给 SV 函数并返回相同的值,但我无法成功执行此任务。这是一个简单的可重现代码:

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

这是我得到的错误:

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.

谁能更正代码以完成此任务?

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您还需要将参数更改为 2x2 维度。

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

    但是对于返回类型你也需要这样做,但是由于语法限制,解压后的数组需要一个返回类型的typedef。

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

    那你不妨到处使用 typedef

    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
    

    附:您没有单独声明迭代变量 ij,它们是隐式的并且在 foreach 语句的范围内是局部的。如果单独声明它们,它们将成为foreach 循环未使用的额外变量。

    【讨论】:

    • 非常感谢 Dave,这些更改后代码执行成功。很高兴了解 foreach 循环中的 i 和 j。也不需要声明 mult[i][j]?它会自动返回 mult[i][j] 吗?如果我在 foreach 中有两个语句,假设 mult2[i][j]=mult[i][j]+1.0 那么这个函数会返回什么?
    • 在 Verilog 中,函数名是一个隐含变量,返回值类型。如果函数在没有使用return 语句的情况下结束,则使用该隐式变量作为​​返回值。在您的示例中,该隐式变量也是具有静态生命周期的变量。
    猜你喜欢
    • 2020-11-01
    相关资源
    最近更新 更多