【问题标题】:passing multidimensional array passing in systemverilog在 systemverilog 中传递多维数组
【发布时间】:2016-03-06 20:30:23
【问题描述】:

我知道在verilog中,多维数组不能通过模块端口。我听说这在 systemverilog 中是允许的,这就是我开始使用 systemverilog 的原因。但是,对于以下代码,我仍然遇到下面显示的 x 和 y 错误。

A reference to an entire array is not permitted in this context [Systemverilog] 

这里是代码。

module Chien(p, clk, reset, load);
        wire [`m - 1 : 0] x [0 : `t - 1];
        wire [`m - 1 : 0] y [0 : `t - 1][0 : `col];
        mul_array mularray0(x, y);
endmodule

我正在使用 ncverilog 进行模拟,并且我选择了 -sv 选项。是我的代码有问题,还是模拟器的问题?

谢谢

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    在 Modelsim/Questa 中对我来说很好,除了您需要在端口列表中声明端口,而不仅仅是端口的位置列表。

    module Chien(input wire p, clk, reset, load);
    

    另外,既然我已经引起了您的注意,请尽量不要在您的类型声明中使用宏。最好有参数和类型定义

    package pkg;
      parameter int col = 4, m = 5, t = 6;
      typedef logic [m-1:0] array_t[t];
    endpackage 
    
    module Chien(input p, clk, reset, load);
            import pkg::*;
            wire array_t x;
            wire array_t y [col];
            mul_array mularray0(x, y);
    endmodule
    

    【讨论】:

    • 我认为这行可能有错字:“parameter int col = 4, m = 5m t = 6;”。不应该是“参数int col = 4,m = 5,t = 6;” ?
    • 感谢您的回复。我不太明白“除非您需要在端口列表中声明端口,而不仅仅是端口的位置列表”的含义。你能详细说明一下吗?另外,我注意到你定义了一个名为array_t的类型,这是让verilog编译器接受多维数组的技巧吗?
    • Verilog 有两种声明模块端口的方式。第一种是较旧的样式,您在模块标题中按位置顺序列出端口名称,然后是端口方向的声明,然后是可选的端口数据类型。您有端口名称列表,但没有声明端口方向。那是编译器错误。第二种也是首选方法是在模块头中声明端口顺序、方向和类型。 array_t 不是必需的。当您在人多的地方重复使用相同的类型时,这只是一种很好的编程习惯。
    • 我尝试将端口声明更改为您提到的那个,它仍然给了我同样的错误。所以我想这是 NCverilog 的问题。
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-10-12
    • 2018-01-08
    • 2020-07-21
    • 2014-03-20
    • 2015-08-17
    相关资源
    最近更新 更多