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

如何在Verilog中将行缓冲区连接到寄存器,verilog,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个值,但我不知道如何在一行代码(或2,3)中分配所有值。上面的代码分配是正确的,但是如果有100000个值,我必须键入100000次吗?您

我对此有意见

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个值,但我不知道如何在一行代码(或2,3)中分配所有值。上面的代码分配是正确的,但是如果有100000个值,我必须键入100000次吗?

您可以使用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];
wire[7:0]tbl[0:999];

注册号[8*1000-1:0]y;// 只要您使用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

如果您可以使用SystemVerilog,则可以通过bitsteaming一步完成

wire [7:0] table [1000];
wire [8*1000-1:0] y = {<<8{table}};
wire[7:0]表[1000];

wire[8*1000-1:0]y={你忘了在右大括号后面加一个分号。是的。我知道。你知道更快的方法吗?我不想键入1000次,不,
[I*8+8-1:I*8]
是非法的,除非
I
是一个genvar。而且
+
在Verilog中不受支持(它在SystemVerilog中)是的,我写了一些C代码。y必须是reg,并且“table”是一个保留字。上面的代码通过了我的Verilog语法检查。@Greg周围没有genblock,为什么genvar?尽管在Verilog中,
+:
可能无法工作。@oldfart Generate是在Verilog-2001中添加的;
+:
-:
也是如此。生成解决方案如下所示:
genvar i;为(i=0;i)生成
wire [7:0] table [1000];
wire [8*1000-1:0] y = {<<8{table}};