【问题标题】:How to define and assign Verilog 2d Arrays如何定义和分配 Verilog 二维数组
【发布时间】:2013-04-09 08:20:01
【问题描述】:

我正在尝试以这种形式创建一个二维数组:

reg arr[5:0][0:5];

当我尝试为它分配一个值时,可以说

assign arr[1] = 22;

它给出了一些错误说:

“对标量 reg 数组 'arr' 的引用不是合法的净左值”和“连续赋值的非法左侧”。

所以我的意图是在数组的索引中分配一个数字。这个任务是如何工作的?任何帮助,建议将不胜感激。

【问题讨论】:

    标签: arrays verilog


    【解决方案1】:

    首先,您不能assign 注册。 assigns 驱动 wire 类型,而不是 reg 类型。要驱动 reg 类型,您需要在逻辑块(如 always 块)内添加一条语句。

    其次,根据您所写的内容,我认为您正在寻找一个多位元素数组,而不是二维数组。

    reg arr[5:0][0:5]; 定义一个二维数组。如果你想要一个多位值的数组,可以容纳大于位,你可以这样声明:

    reg [M:0] arr[0:N] - 这描述了一个由 (N+1) 个元素组成的数组,其中每个元素是一个 M+1 位数。如果你以这种方式声明它,那么你应该能够在其中存储一个像 22 这样的值,假设你使用了一个 always 块。

    【讨论】:

    • 是的,这正是我要找的。存储值怎么样,必须使用 always 块我们不能手动存储它们吗?更重要的是,我们应该使用 assign 吗?
    • “手动”是什么意思?如果您只想在开始时分配它,则可以使用初始块。 assigns 仅用于驱动线,而不是 regs。查看任何介绍性的 verilog 教程,了解有关 reg 和 wire 之间区别的更多信息。
    • (M+1)(N+1),不是-1
    【解决方案2】:

    您不能在 reg 类型上使用连续赋值(又名 assign 语句)。这与它是一个数组无关。

    arr 的声明更改为wire 类型将使您摆脱您发布的错误消息。或者,您可以使用initialalways 块中的程序分配来分配它。

    但是,您仍然需要在赋值中提供数组的两个维度。您正在声明一个 1 位值的二维数组。

    所以你需要将它指定为:

    arr[0][0] = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多