01signal.com

Utiliser des FIFO sur les FPGA Versal ACAP

Où est passé le FIFO Generator ?

Lorsqu'on utilise des FPGA Versal, AMD ne fournit aucun bloc IP permettant d'implémenter une FIFO simple qui puisse être utilisée dans une instanciation (instantiation) en Verilog ou VHDL. Le célèbre FIFO Generator n'est pas disponible pour ces FPGA. C'est du moins le cas avec Vivado 2022.1 et les versions antérieures.

Par conséquent, si la partie FPGA d'un design existant est remplacée par un FPGA Versal, il y a de fortes chances que des modifications soient nécessaires. Presque tous les projets FPGA utilisent le FIFO Generator.

Il en va de même pour le Memory Generator : ce bloc IP, parfois utilisé pour créer des block RAM, a lui aussi été supprimé sur les FPGA Versal. Ce bloc IP est toutefois moins utilisé, car les block RAM sont souvent créées par inférence. En d'autres termes, on déclare généralement un tableau en Verilog (ou en VHDL) pour créer une RAM.

À noter que les FIFO et les RAM dotées d'une interface AXI restent disponibles sous forme de blocs IP. L'absence de prise en charge des FPGA Versal ne concerne que les FIFO et les block RAM à interface « native ».

Il existe plusieurs options pour contourner ce problème. Je vais en proposer deux.

Pour un tutoriel général sur les FIFO, reportez-vous à cette série de pages.

Option n°1 : utiliser les macros paramétrées AMD

Les macros paramétrées AMD (AMD Parameterized Macros) sont disponibles dans Vivado pour tous les FPGA pris en charge par ce logiciel, c'est-à-dire les FPGA de la série 7 et ultérieurs. Ces macros peuvent être utilisées dans des instanciations, comme n'importe quel module en Verilog ou en VHDL. Leur documentation se trouve avec les primitives (primitive) du FPGA, par exemple dans le Versal Architecture Premium Series Libraries Guide, UG1485.

Il y a toutefois une différence importante entre les primitives et les macros paramétrées : lorsque le synthétiseur (synthesizer) rencontre une primitive, il produit en général un seul élément logique dans la netlist synthétisée. Une macro paramétrée, en revanche, produit tout un ensemble d'éléments logiques, tout comme un module Verilog.

Il existe plusieurs macros paramétrées qui génèrent des FIFO, notamment celles-ci :

Les FIFO produites par ces deux macros ont une interface « native », c'est-à-dire avec des ports comme wr_en et rd_en. Presque toutes les options offertes par le FIFO Generator peuvent être activées en réglant les paramètres d'instanciation de la macro. Entre autres, ces FIFO peuvent être configurées en « Standard FIFO » ou en First Word Fall Through (FWFT).

Il y a aussi quelques macros pour implémenter des RAM de différentes sortes. Quoi qu'il en soit, il existe également plusieurs FIFO AXI-Stream de différents types, mais celles-ci peuvent être créées avec des blocs IP, même pour les FPGA Versal.

Pour des informations complètes sur l'utilisation de ces macros, reportez-vous au Libraries Guide correspondant, à savoir le UG1485 pour les FPGA Versal. On peut aussi obtenir un modèle d'instanciation dans Vivado : sélectionnez Tools > Language Templates, puis parcourez Verilog > AMD Parameterized Macros (XPM) > XPM > XPM_FIFO, et choisissez Synchronous FIFO ou Asynchronous FIFO, selon le cas.

Voici un exemple de création d'une FIFO synchrone de base, équivalente à celle qui est présentée sur cette page.

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

Option n°2 : l'Embedded FIFO Generator

L'Embedded FIFO Generator est pratiquement identique au célèbre FIFO Generator, mais il ne peut être utilisé qu'à l'intérieur d'un block design.

La solution évidente consiste donc à créer un block design et à y ajouter un Embedded FIFO Generator. On règle ensuite les paramètres de ce bloc IP exactement comme avec le FIFO Generator d'origine. Puis on connecte tous les ports de la FIFO à des ports externes. Le résultat est un block design qui a des ports de FIFO, se comporte comme une FIFO et en est donc une.

Cette solution n'est pas très élégante, notamment parce que les noms des ports de la FIFO deviennent plus longs que d'habitude. Par exemple, au lieu de wr_en, le port s'appelle FIFO_WRITE_0_wr_en.

Conclusion

Même si la disparition du FIFO Generator du catalogue IP (IP Catalog) de Vivado est soudaine et inexplicable, il n'est généralement pas difficile de remplacer ce bloc IP par une macro paramétrée ou un block design.

Dans un contexte plus large, il est peut-être judicieux de cesser d'utiliser le FIFO Generator, même pour les FPGA qui le prennent en charge, indépendamment de l'effet que cela peut avoir sur la possibilité de migrer le design vers des FPGA Versal.

Cette page a été traduite de l’anglais par une machine. En cas de doute, veuillez vous reporter au texte original
Copyright © 2021-2026. All rights reserved. (dcc38493)