如果多线阵列是一条线,如何在一条线上分配?
assign TO[W1:0][W2:0] = cntrl ? FROM1[W1:0][W2:0] : FROM2[W1:0][W2:0];
如果我使用它,我会收到语法错误。
除了使用generate
或for
循环之外还有其他方法吗?
答案 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解决方案:(假设W1
和W2
是参数,而不是变量)
// '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