2013-04-16 799 views
2

我试图创建在形式的二维数组:如何定义和分配的Verilog二维数组

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

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

assign arr[1] = 22; 

它给一些错误说:

“参考标章阵列‘改编’是不是合法的净左值”和“连续分配的非法左侧”。

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

回答

14

首先,你不能assign到暂存器。 assigns驱动器导线类型,而不是reg类型。要驱动一个reg类型,你需要在一个逻辑块内的语句像always块一样。其次,根据你写的内容,我认为你正在寻找一个多位元素的数组,而不是二维数组。

reg arr[5:0][0:5];定义一个二维数组的单个位。如果您想要一个可以保持大于一位的多位值数组,您声明它是这样的:

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

+0

是的,这正是我正在寻找的。如何存储值,是否必须使用always块,我们不能手动存储它们?还有更多的事情,我们应该使用assign吗? – bledi

+0

你是什么意思'手动'?如果您只是想在开始时分配它,则可以使用初始块。分配仅用于驱动电线,而不是注册表。查看任何介绍性的verilog教程,了解有关reg和wire之间区别的更多信息。 – Tim

+0

是的,我知道了。无论如何感谢 – bledi

3

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

arr的声明更改为wire将使您通过您发布的错误消息。或者,您可以使用initialalways区块中的程序性分配对其进行分配。

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

所以你需要将其指定为:

所有的
arr[0][0] = 1;