3

Verilog で低レイテンシの最初のワード フォールスルー fifo を実装しようとする以下のコードがあります。

   reg [width-1:0]       mem [depth-1:0];

   always @ (posedge clk) begin
      if (wr_en) begin
         mem[wr_pointer[address_width-1:0]] <= #1 din;
      end
   end

   assign #1 dout = mem[rd_pointer[address_width-1:0]];

   always @ (posedge clk) begin
      if (reset) begin
         wr_pointer <= #1 0;
      end else if (wr_en) begin
         wr_pointer <= #1 wr_pointer + 1'b1;
      end
   end

   always @ (posedge clk) begin
      if (reset) begin
         rd_pointer <= #1 0;
      end else if (rd_en) begin
         rd_pointer <= #1 rd_pointer + 1'b1;
      end
   end

それを合成すると、次のメッセージが表示されます。

INFO:Xst:3218 - HDL ADVISOR - The RAM <Mram_mem> will be implemented on LUTs 
either because you have described an asynchronous read or because of currently
unsupported block RAM features. If you have described an asynchronous read, 
making it synchronous would allow you to take advantage of available block RAM
resources, for optimized device usage and improved timings. Please refer to 
your documentation for coding guidelines.

誰か私にメッセージを説明してもらえますか? これには非同期読み取りが必要だとは思いません。クロック エッジで読み取りポインターのみを変更します。私が行方不明になっていることは他にありますか?

4

1 に答える 1

5

以下の行は、非同期読み取りです。

assign #1 dout = mem[rd_pointer[address_width-1:0]];

以下のコードのようなものに変更して、同期させます。

reg [width-1:0] dout;
always @ (posedge clk) begin
   if (reset) begin
      dout <= #1 0;
   end else if (rd_en) begin
      dout <= #1 mem[rd_pointer[address_width-1:0]]
   end
end

非同期読み取りは、メモリ アドレスが (クロック エッジだけでなく) いつでも変更される可能性があるため、メモリ内のすべてのワードがいつでも利用可能でなければならないことを意味します。

非同期読み取りはすべてのメモリ ワードにアクセスする必要があるため、FPGA はオンチップ RAM を使用できません。オンチップ RAM には、メモリ内の 1 ワードのみにアクセスできる読み出しバスがあり、クロック エッジで変化します。そのため、一連の LUT から代わりにメモリを構築します。その場合、メモリはフリップフロップの 2D アレイから構築されたものと考えることができ、今ではすべてのワードに接続できます。

于 2012-11-29T16:53:20.757 に答える