在Verilog中处理二维数组中的列

时间:2019-03-21 15:35:23

标签: verilog fpga

我正在用verilog处理1023 * 1023 MATRIX。我正在尝试执行以下操作: 1)一次选择每一行,进行一些修改,将输出写回到相应的行。例如,我首先选择row0,对其进行更改,然后将输出写回到row0。我对所有1023行执行此操作。 2)然后,我一次选择每一列,进行一些修改,然后将数据写回。

我可以创建一个二维数组,例如reg [1022:0] my_array [1022:0]。 现在,访问行很容易。我可以编写my_array [0]来访问第一行,依此类推。但是,如何访问列?

1 个答案:

答案 0 :(得分:3)

最好不要想

reg [1022:0] my_array[1022:0];

作为1023 x 1023数组;最好将其视为1023 1023位数字的数组。这是一个真正的1023 x 1023数组:

reg my_array[1022:0][1022:0];

SystemVerilog概括了数组并引入了一些新术语,这些术语在谈论Verilog时很有用。 (无论如何,Verilog只是SystemVerilog的一个非正式子集。)在SystemVerilog中,您可以这样声明数组

<type> <packed dimensions> <name> <unpacked dimensions>

因此,与原始声明等效的是

logic [1022:0] my_array [1022:0];

因此,第一个[1022:0]是一个包装尺寸,第二个[1022:0]是一个未包装尺寸。在SystemVerilog中,您可以具有任意多个打包的尺寸,也可以具有多个打包的尺寸。在Verilog中,您可以根据需要选择任意多个解压缩尺寸,但是您只能选择一个解压缩尺寸

关于访问打包维度的规则与关于访问未打包维度的规则不同。基本上,访问未打包尺寸的规则要严格得多。 (这就是为什么您会感觉到行和列在行为上有所不同的原因。)基本上,对于未打包的尺寸,您可以选择

  • 访问单个元素或
  • 一次访问整个数组。

就是这样。因此,当您处理解压缩维度时,您将必须使用某种循环来完成您想做的事情。而且,如果您真正使用的是由1023 x 1023单位数字组成的数组,那么,要访问未压缩的尺寸总是要花更多的功夫,您可能要考虑使两个尺寸都打开包装并为两个尺寸使用循环