Verilog中的Fifo缓冲区。始终生成

Verilog中的Fifo缓冲区。始终生成,verilog,fifo,Verilog,Fifo,我正在尝试编写通用fifo缓冲区。 为了使它具有通用性,我使用了这样的代码 genvar i; generate for(i=0;i<BusWidthIn;i=i+1) begin: i_buffin always @ (negedge clkin) begin if (!full) Buffer[wr_ptr+i] <= datain[i*BitPerWord+BitPerWord-1:i*BitPerWord]; end end endgenerate

我正在尝试编写通用fifo缓冲区。 为了使它具有通用性,我使用了这样的代码

genvar i;
generate
for(i=0;i<BusWidthIn;i=i+1) begin: i_buffin
  always @ (negedge clkin) begin
    if (!full)
      Buffer[wr_ptr+i] <= datain[i*BitPerWord+BitPerWord-1:i*BitPerWord];
  end
end
endgenerate
genvari;
生成

对于(i=0;i我认为问题在于合成不知道wr_ptr总是3的倍数,因此从合成的角度来看,3个不同的always块可以分配给每个缓冲区条目。我认为您可以重新编码逻辑,为每个always块分配一个缓冲区条目

genvar i, j;
generate
for(i=0;i < (1<<(BufferLen)); i=i+1) begin: i_buffin
for(j = (i%BusWidthIn);j == (i%BusWidthIn); j++) begin // a long way to write 'j = (i%BusWidthIn);'
  always @ (negedge clkin) begin
    if (!full) begin
      if (wr_ptr*BusWidthIn + j == i) begin
        Buffer[i] <= datain[j*BitPerWord+BitPerWord-1:j*BitPerWord];
      end
    end
  end
end
end
endgenerate
genvari,j;
生成

对于(i=0;i<(1我认为问题在于合成不知道wr_ptr总是3的倍数,因此从合成的角度来看,3个不同的always块可以分配给每个缓冲区条目。我认为您可以重新编码逻辑,为每个always块分配一个缓冲区条目

genvar i, j;
generate
for(i=0;i < (1<<(BufferLen)); i=i+1) begin: i_buffin
for(j = (i%BusWidthIn);j == (i%BusWidthIn); j++) begin // a long way to write 'j = (i%BusWidthIn);'
  always @ (negedge clkin) begin
    if (!full) begin
      if (wr_ptr*BusWidthIn + j == i) begin
        Buffer[i] <= datain[j*BitPerWord+BitPerWord-1:j*BitPerWord];
      end
    end
  end
end
end
endgenerate
genvari,j;
生成

对于(i=0;i<(1其他),则代码中的
*\ptr
应分配非阻塞分配(
其他,则代码中的
*\ptr
应分配非阻塞分配(
code look fine on。code look fine on。我更喜欢看到resets
initial
块是初始化FPGA值的有效方式。谢谢@Morgan,我不知道。我编辑了它。我更喜欢看到resets
initial
块是初始化FPGA值的有效方式。谢谢@Morgan,我不知道我把它删掉了。
integer i;

always @(negedge clkin) begin
  if (!full) begin
    for (i=0;i<BusWidthIn;i=i+1) begin: i_buffin
      Buffer[wr_ptr+i] <= datain[i*BitPerWord +: BitPerWord];
    end
    wr_ptr <= wr_ptr + BusWidthIn;
  end
end