在 verilog 中操作二维数组中的列

Manipulating columns in a 2-D array in verilog

我正在使用 verilog 中的 1023*1023 矩阵。我正在尝试执行以下操作: 1)一次选择每一行,做一些修改,将输出写回相应的行。例如,我首先选择第 0 行,对其进行更改并将输出写回第 0 行。我对所有 1023 行都这样做。 2) 然后,我一次选择每一列,进行一些修改,然后将数据写回。

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

最好别想

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 单位数字的数组,那么,鉴于访问解压维度总是需要更多工作,您可能需要考虑解压两个维度并对两个维度使用循环.