FIFO Generatorはどこ?
Versal FPGAsを使用する場合、 Xilinx は、 Verilog または VHDLの instantiation で使用できるプレーンな FIFO を実装する IP block を提供しません。よく知られている FIFO Generator IP は、これらの FPGAsには使用できません。これは、少なくとも Vivado 2022.1 以前の場合です。
したがって、既存の FPGA design の FPGA part を Versal FPGAに変更する場合、プロジェクトにいくつかの変更が必要になる可能性があります。ほとんどすべての FPGA プロジェクトが FIFO Generatorを使用しています。
同じことが Memory Generatorにも当てはまります。 block RAMs を作成するために時々使用される IP は、 Versal FPGAs でも削除されました。ただし、 block RAMs は inferenceによって作成されることが多いため、この IP はあまり使用されません。つまり、 Verilog (または VHDL) 内の array は、通常、 RAMを作成する目的で宣言されます。
AXI インターフェイスを持つ FIFOs および RAMs は、 IPsとして引き続き使用できることに注意してください。 Versal FPGAs のサポートの欠如は、"native" インターフェースを持つ FIFOs と block RAMs にのみ関連しています。
この問題を回避するには、いくつかのオプションがあります。考えられる2つの方法を提案します。
FIFOsの一般的なチュートリアルについては、この一連のページを参照してください。
オプション1: Xilinx Parameterized Macrosを使う
Xilinx Parameterized Macros は、このソフトウェアでサポートされているすべての FPGAs (つまり、 series-7 FPGAs 以降) の Vivado で使用できます。これらのマクロは、 Verilog または VHDLの module と同様に、 instantiationsで使用できます。それらのドキュメントは、 FPGAの primitives と一緒に見つけることができます (たとえば、 Versal Architecture Premium Series Libraries Guide, UG1485にあります)。
ただし、 primitives と Parameterized Macrosには重要な違いがあります。 synthesizer が primitiveに遭遇すると、通常、 synthesized netlistで 1 つの logic element のみを生成します。一方、 Parameterized Macroは、 Verilog moduleと同様に、大量の logic elementsを生成します。
FIFOsを生成する parameterized macros がいくつかありますが、特に次の 2 つです。
- synchronous FIFO を生成するxpm_fifo_sync(単一の clockを使用)。
- asynchronous FIFO (dual-clock) を生成するxpm_fifo_async。
これら 2 つの macros によって生成される FIFOs には、「native」インターフェイス、つまり wr_en や rd_enのようなポートがあります。 FIFO Generator で利用可能だったほとんどすべてのオプションは、 macroの instantiation parametersを設定することで有効にすることができます。特に、これらの FIFOs は「Standard FIFOs」または First Word Fall Through (FWFT)のいずれかになります。
さまざまな種類の RAMs を実装するための macros もいくつかあります。いずれにせよ、 AXI-Stream FIFOs にもさまざまな種類がありますが、これらは IP blocksで作成できます。 Versal FPGAsでも作成できます。
これらの macrosの使用方法の詳細については、関連する Libraries Guide( Versal FPGAsの UG1485 ) を参照してください。 Vivadoで instantiation template を取得することもできます。 Tools > Language Templates を選択して Verilog > Xilinx Parameterized Macros (XPM) > XPM > XPM_FIFOに移動し、そこから該当する Synchronous FIFO または Asynchronous FIFOを選択します。
これは、このページに示されているものと同じことを行う baseline synchronous FIFOの作成方法の例です。
module fifo_8x2048
#(parameter width = 8, depth = 2048)
(
input clk,
input rst,
input wr_en,
input [(width-1):0] din,
input rd_en,
output [(width-1):0] dout,
output full,
output empty
);
xpm_fifo_sync #(
.DOUT_RESET_VALUE("0"),
.ECC_MODE("no_ecc"),
.FIFO_MEMORY_TYPE("auto"),
.FIFO_READ_LATENCY(1),
.FIFO_WRITE_DEPTH(depth),
.FULL_RESET_VALUE(1),
.READ_DATA_WIDTH(width),
.READ_MODE("std"),
.SIM_ASSERT_CHK(0),
.USE_ADV_FEATURES("0000"),
.WAKEUP_TIME(0),
.WRITE_DATA_WIDTH(width)
)
xpm_fifo_sync_inst (
.almost_empty(),
.almost_full(),
.data_valid(),
.dbiterr(),
.dout(dout),
.empty(empty),
.full(full),
.overflow(),
.prog_empty(),
.prog_full(),
.rd_data_count(),
.rd_rst_busy(),
.sbiterr(),
.underflow(),
.wr_ack(),
.wr_data_count(),
.wr_rst_busy(),
.din(din),
.injectdbiterr(1'b0),
.injectsbiterr(1'b0),
.rd_en(rd_en),
.rst(rst),
.sleep(1'b0),
.wr_clk(clk),
.wr_en(wr_en)
);
endmodule
オプション #2: Embedded FIFO Generator
Embedded FIFO Generator はよく知られている FIFO Generatorと実質的に同じですが、 Embedded FIFO Generator は block design内でのみ使用できます。
したがって、明らかな解決策は、 block design を作成して Embedded FIFO Generatorを追加することです。次に、この IP block のパラメータを以前の FIFO Generatorとまったく同じように設定します。その後、 FIFOの ports をすべて外部 portsに接続します。その結果、 FIFOのような ports を持ち、 FIFOのように動作する block design が FIFOになります。
特に、 FIFOの ports の名前が通常よりも長くなるため、この解決策は少し醜いです。たとえば、 wr_enの代わりに、 FIFO_WRITE_0_wr_enという名前があります。
結論
Vivadoの IP Catalog から FIFO Generator が姿を消したのは突然で説明のつかないことですが、通常、この IP を Parameterized Macro または block designに置き換えることは難しくありません。
より広い文脈では、 design を Versal FPGAsに移行する可能性にどのように影響するかに関係なく、 FIFO Generator をサポートする FPGAs であっても FIFO Generator の使用を停止することをお勧めします。