在verilog中分配整个数组

时间:2013-11-27 23:11:50

标签: arrays verilog assignment-operator synthesis

我正在尝试将二维数组复制到另一个中,如下所示:

reg [11:0] input_matrix [0:array_width - 1] [0:array_height - 1]; 
reg [11:0] output_matrix [0:array_width - 1] [0:array_height - 1];
always @(posedge clk)
begin
     if(<some condition>)
          output_matrix <= input_matrix;
end

因此,我们有两个12位值的2D数组。我想把一个复制到另一个。

这似乎不可能。有谁知道这样做的正确方法?或者,如果没有,解释为什么不可能?我看不出为什么这个任务无法合成的任何原因。

由于显而易见的原因,for循环通常不能很好地合成。但是,这种情况是否可以使用for循环,因为循环是静态定义的?

2 个答案:

答案 0 :(得分:2)

您编写的代码是可综合的。见本文第2.5.2节: http://www.lcdm-eng.com/papers/snug13_SNUG-SV-2013_Synthesizable-SystemVerilog_paper.pdf

答案 1 :(得分:2)

正如@toolic所提到的for循环是可综合的。这是完全正常的情况,因为它可以静态展开。

内部循环可能没有必要,但我发现某些版本的综合工具在内存(阵列)分配方面苦苦挣扎,但它们工作但是重新命名了总线,这可能会导致ECO出现问题。

reg [11:0] input_matrix  [0:array_width - 1] [0:array_height - 1]; 
reg [11:0] output_matrix [0:array_width - 1] [0:array_height - 1];
integer i;
integer j;

always @(posedge clk) begin
  if(<some condition>) begin
    for (i=0; i<array_width; i=i+1 ) begin
      for (j=0; j<array_height; j=j+1 ) begin
        output_matrix[i][j] <= input_matrix[i][j];
      end
    end
  end
end