【问题标题】:Assigning entire array in verilog在verilog中分配整个数组
【发布时间】:2013-12-13 19:56:21
【问题描述】:

我正在尝试将二维数组复制到另一个数组中:

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 位值的二维数组。我想把一个复制到另一个。

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

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

【问题讨论】:

    标签: arrays verilog assignment-operator synthesis


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

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