如何在Verilog中将行缓冲区连接到寄存器中

时间:2018-02-16 11:14:31

标签: verilog

我有这个问题

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次?

2 个答案:

答案 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}};