我有这个问题
wire [7:0] table [0:999];
wire [8*1000-1:0] y;
assign y = {table[0], table[1], table[2], ...., table[999]}; // this line code is right, I don't want hard code
我想y是表的所有1000个值,但我不知道如何在1行代码(或2,3)中分配所有值。上面的代码分配是正确的,但如果有100000个值,我是否必须输入100000次?
答案 0 :(得分:1)
您可以使用for循环,但问题是敏感度列表。并非所有模拟器都允许二维数组作为灵敏度参数。
wire [7:0] tbl [0:999];
reg [8*1000-1:0] y; // <<== Needs to be reg
integer i;
always @( tbl ) // <<== may give error/warning
for (i=0; i<1000; i=i+1)
y[i*8 +: 8] = tbl[i];
答案 1 :(得分:1)
只要您使用Verilog-2001或更高版本,就可以使用:
wire [7:0] table [0:999];
reg [8*1000-1:0] y;
integer i;
always @* begin
for (i=0; i<1000; i=i+1) begin
y[ i*8 +: 8] = table[i];
end
end
请参阅:Indexing vectors and arrays with +:
Verilog-95解决方案不是很漂亮,而且开销更大:
wire [7:0] table [0:999];
reg [8*1000-1:0] y;
integer i;
always @( table ) begin
y = {8000{1'b0}};
for (i=999; i>=0; i=i-1) begin
y = {[8*999-1:0],table[i]};
end
end
如果您可以使用SystemVerilog,可以使用bitsteaming
一步完成wire [7:0] table [1000];
wire [8*1000-1:0] y = {<<8{table}};