verilog中的多维数组赋值,没有循环?

时间:2015-07-08 12:08:27

标签: multidimensional-array verilog

如果多线阵列是一条线,如何在一条线上分配?

assign TO[W1:0][W2:0] = cntrl ? FROM1[W1:0][W2:0] : FROM2[W1:0][W2:0];  

如果我使用它,我会收到语法错误。

除了使用generatefor循环之外还有其他方法吗?

3 个答案:

答案 0 :(得分:1)

您需要使用SystemVerilog对数组进行聚合分配。

答案 1 :(得分:0)

如果要分配数组的所有值,则使用带有勾选'{ and }的解包数组大括号。

用法示例

module top ( input i);

  wire d [0:1][0:3];
  wire a [0:1][0:3]='{ '{1,1,1,1}, '{1,1,1,1} };
  wire b [0:1][0:3]='{ '{0,0,0,0}, '{0,0,0,0} };

  assign  d = i? (' { '{a[0][0],a[0][1],a[0][2],a[0][3]},'{b[1][0],b[1][1],b[1][2],b[1][3]}}):
                 (' { '{b[1][0],b[1][1],b[1][2],b[1][3]},'{a[0][0],a[0][1],a[0][2],a[0][3]}});
endmodule

此处wire a [0:1][0:3]='{ '{1,1,1,1}, '{1,1,1,1} };wire b [0:1][0:3]='{ '{0,0,0,0}, '{0,0,0,0} };代表

// a[0][0] = 1  b[0][0] = 0
// a[0][1] = 1  b[0][1] = 0
// a[0][2] = 1  b[0][2] = 0
// a[0][3] = 1  b[0][3] = 0
// a[1][0] = 1  b[1][0] = 0
// a[1][1] = 1  b[1][1] = 0
// a[1][2] = 1  b[1][2] = 0
// a[1][3] = 1  b[1][3] = 0

可以在eda-playground链接

中找到工作示例

答案 2 :(得分:0)

两个纯verilog解决方案:(假设W1W2是参数,而不是变量)

// 'TO' must be a reg
integer i,j;
always @* begin
  for(i=0; i<=W1; i=i+1) begin
    for(j=0; j<=W2; j=j+1) begin
      TO[i][j] = cntrl ? FROM1[i][j] : FROM2[i][j];
    end
  end
end

// 'TO' must be a wire
genvar i,j;
generate
  for(i=0; i<=W1; i=i+1) begin
    for(j=0; j<=W2; j=j+1) begin
      assign TO[i][j] = cntrl ? FROM1[i][j] : FROM2[i][j];
    end
  end
endgenerate