URL: https://linuxfr.org/news/k1g1-le-premier-fpga-libre Title: k1g1 : le premier FPGA Libre… Authors: killruana Davy Defaud, Benoît Sibaud et palm123 Date: 2019-11-04T10:34:01+01:00 License: CC by-sa Tags: k1g1, fpga et kfpga Score: 4 _Cette dépêche est tirée d’un journal annonçant le k1g1, le premier FPGA libre… à sa connaissance._ Parmi les premiers commentaires du journal, on peut noter la promesse du succès mais pas avant dix ou vingt ans, des discussions sur les sociétés du domaine, l’évocation d’un puce de test, archipelago, le FPGA virtuel, etc. ---- [Journal à l’origine de la dépêche](https://linuxfr.org/users/killruana/journaux/k1g1-le-premier-fpga-libre) ---- k1g1 : le premier FPGA Libre… à la connaissance de son auteur : > « Aujourd’hui est un grand jour pour moi, pour la communauté libre et, enfin, pour l’Humanité. Oui, rien que ça. En effet, je viens de valider en simulation au niveau porte logique (_gate‐level simulation_ en anglais, voir la page « _[logic simulation](https://en.wikipedia.org/wiki/Logic_simulation)_ ») le premier cœur FPGA libre basé sur ma propre architecture. » Mais avant d’aller plus loin, un peu de contexte. # Un FPGA, c’est qu’est‑ce quoi ? Pour schématiser grossièrement, il existe trois types de circuits intégrés : les [ASIC](https://fr.wikipedia.org/wiki/Application-specific_integrated_circuit "Application‐specific integrated circuit (circuit intégré propre à une application)"), les processeurs et les [FPGA](https://fr.wikipedia.org/wiki/Circuit_logique_programmable "Field‐Programmable Gate Array — circuit logique programmable"). ## ASIC Les ASIC (_Application‐Specific Integrated Circuit_) sont des circuits intégrés dédiés à une application donnée, telle qu’un décodeur vidéo H.265, un mineur de crypto‐monnaie… Vu qu’ils sont conçus pour ne faire qu’une seule tâche, ils sont généralement plus performants et plus efficaces d’un point énergétique que le programme équivalant exécuté par un processeur. Mais leur conception est longue, coûteuse et, surtout, ils ne sont pas évolutifs : une fois la fonctionnalité gravée dans le silicium, impossible de la mettre à jour. Il faut obligatoirement créer un nouveau circuit. ## Processeur À l’opposé, les processeurs sont des circuits généralistes pouvant réaliser un grand nombre de tâches, à condition de leur fournir le programme idoine. Mais en comparaison, ils sont moins performants et consomment plus d’énergie. ## FPGA Les FPGA (_Field‐Programmable Gate Array_) sont un compromis entre les ASIC et les processeurs. Tout comme les processeurs, ils sont reprogrammables, et comme les ASIC, ils sont performants (mais moins que ces derniers). Un FPGA se compose habituellement de blocs logiques permettant d’implémenter des équations logiques et d’un réseau de routage pour interconnecter les blocs logiques. On pourrait en quelque sorte dire qu’un FPGA est un émulateur d’ASIC. # Mais pourquoi se lancer dans cette aventure ? De 2014 à 2018, j’ai travaillé dans une _start‑up_ qui concevait des eFPGA (le « e » veut dire « _embeddable_ », signifiant que les FPGA sont intégrables dans des [SoC](https://fr.wikipedia.org/wiki/Syst%C3%A8me_sur_une_puce "System on Chip — système monopuce")). J’ai beaucoup aimé le concept, mais j’ai été extrêmement frustré par la grande fermeture de ce milieu : les outils pour concevoir les puces sont propriétaires, les [PDK](https://en.wikipedia.org/wiki/Process_design_kit "Process Design Kit") des fondeurs sont propriétaires, les FPGA sont propriétaires et les outils pour programmer les FPGA sont propriétaires. Bref, c’est proprio de A à Z. Il est à noter qu’il existe des projets en Open Hardware utilisant des FPGA et que depuis peu il existe une chaîne d’outils libre ayant fait l’objet d’un [journal](https://linuxfr.org/users/martoni/journaux/2019-l-annee-de-la-liberation-des-fpga) permettant de programmer certains FPGA. Mais il manque le plus important, le FPGA libre lui‐même. Et c’est pourquoi j’ai décidé de créer une architecture de FPGA libre. # Open FPGA Platform, kFPGA et k1g1 ## Open FPGA Platform Open FPGA Platform (OFP) est une chaîne d’outils visant la création, l’[implémentation](https://fr.wikipedia.org/wiki/Flot_de_conception) et la programmation de FPGA. À partir de modèles décrivant des architectures FPGA, la solution va permettre à l’utilisateur de créer son propre cœur FPGA ayant les caractéristiques voulus, de générer le flot de conception permettant de l’implémenter à destination du fondeur ou FPGA cible (oui, on peut faire de la « FPGA‐ception », ce qui est pratique pour la phase de développement) et de générer les outils de programmation. Pour faire une analogie avec des processeurs, c’est comme si Bob, à partir des modèles d’architecture processeur Intel et ARM, utilisait OFP pour se créer un processeur compatible Intel composé de huit cœurs de calcul et un autre compatible ARM double cœur, qu’il utilisait OFP pour les implémenter respectivement pour une fabrication chez le fondeur Global Foundry et pour le faire tourner sur un FPGA Xilinx, et, qu’enfin, OFP générait les chaînes de compilation spécifiques à ces processeurs. ### Génération du [RTL](https://fr.wikipedia.org/wiki/Register_Transfer_Level "Register Transfer Level") Il s’agit de la partie générant le code décrivant le FPGA à partir de l’architecture sélectionnée et des paramètres de personnalisation spécifiés par l’utilisateur. Pour l’instant, seul le [Verilog](https://fr.wikipedia.org/wiki/Verilog) est pris en charge comme langage cible. ### Implémentation Pour les flots de conception, je vais prochainement intégrer la prise en charge de [qflow](http://opencircuitdesign.com/qflow/) pour les implémentations physiques et la gestion du Vivado de Xilinx pour cibler ses FPGA. La prise en charge des FPGA Intel (ex‑Altera) et Lattice Semiconductor au travers de leurs outils respectifs est envisagé mais n’est pas une priorité. Offrez‐moi un de leur FPGA et peut‐être que la priorité augmentera. ;) À plus long terme, je compte aussi ajouter la gestion des outils de chez [Cadence](https://www.cadence.com/content/cadence-www/global/en_US/home/solutions/advanced-node-solutions/digital-advanced-node.html.html), [Synopsys](https://www.synopsys.com/implementation-and-signoff/fusion-design-platform.html) et [Mentor](https://www.mentor.com/products/ic_nanometer_design/place-route/) (les trois principaux éditeurs d’outils de microélectronique) pour faire les implémentations physiques, mais ça attendra que j’ai plusieurs centaines de k€ sur mon compte en banque pour me payer les licences nécessaires (si des commerciaux passent par là, n’hésitez pas à me faire une offre pour des licences de R & D non destinées à réaliser un _[tape‑out](https://en.wikipedia.org/wiki/Tape-out)_. ;) ### Programmation Pour la programmation des FPGA, je compte me baser sur [Yosys](https://github.com/YosysHQ/yosys) pour faire la synthèse logique et sur [nextpnr](https://github.com/YosysHQ/nextpnr) pour faire le [placement‑routage](https://fr.wikipedia.org/wiki/Placement-routage). En attendant, je fais la programmation à la main et c’est _un peu_ relou… Voir [ce code](https://git.slaanesh.org/open-fpga-platform/kfpga-core-k1g1/src/commit/04f18ca100d5ab6a76fa92c3718619fe031f0b91/tb/or2/test_dut.py#L11) pour avoir un exemple. ## kFPGA kFPGA (_killruana’s FPGA_, oui, j’ai manqué d’inspiration pour choisir le nom) est une architecture FPGA destinée à être utilisée avec Open FPGA Platform. Il s’agit pour l’instant d’une architecture extrêmement simple : une grille de tuiles logiques composées chacune d’une boîte de commutation (_switchbox_) pour le routage et d’une grappe d’éléments logiques (_Look‑Up Table_ suivie d’une _Flip‑Flop_ débrayable). [![Architecture kFPGA](https://i.zcraft.fr/mini_9750631572823407.png)](https://i.zcraft.fr/9750631572823407.png) _Architecture kFPGA_ [![Détail d’une tuile](https://i.zcraft.fr/mini_4752661572823453.png)](https://i.zcraft.fr/4752661572823453.png) _Détail d’une tuile_ Tous les éléments sont paramétrables : le nombre de tuiles, le nombre d’éléments logiques par tuile, la taille des [tables de correspondance](https://fr.wikipedia.org/wiki/Table_de_correspondance) ([LUT](https://en.wikipedia.org/wiki/Lookup_table#Hardware_LUTs "Lookup Table") dans les éléments logiques, la taille des bus d’interconnexion entre les tuiles, le nombre d’entrées‑sorties du cœur, le nombre de signaux d’horloge, de _set_, de _reset_ et d’_enable_. Je compte l’améliorer dans les itérations suivantes afin de me rapprocher de ce qu’on peut trouver dans les FPGA commerciaux (blocs de mémoire vive, [DSP](https://fr.wikipedia.org/wiki/Processeur_de_signal_num%C3%A9rique "Digital Signal Processor — processeur de signal numérique") — processeur de signal numérique — de multiplication, nouvel élément logique plus polyvalent, etc.). Pour l’instant, il s’agit surtout d’une preuve de concept pour valider qu’il est possible de faire une architecture FPGA dans son garage. ;) ## k1g1 k1g1 (nomenclature retenue pour le moment : kq) est un FPGA basé sur l’architecture kFPGA. Il possède une seule tuile logique contenant un seul élément logique constitué d’une [LUT](https://en.wikipedia.org/wiki/Lookup_table#Hardware_LUTs) à deux entrées (là où la concurrence propose généralement de 4 000 à 150 000 éléments logiques constitués de LUT à six entrées…), et une paire d’entrées‑sorties par face. Bref, c’est le minimum syndical pour valider le concept. En utilisant la chaîne d’outils libre qflow, j’ai pu réaliser une implémentation physique utilisant la bibliothèque de portes logiques OSU 0,350 µm. Le circuit obtenu est composé de 139 portes logiques, fait 208,0 x 130,0 µm, soit 27 040 µm² (0,02704 mm²), et peut tourner à la fréquence maximale de 200 MHz. N’est‐il pas beau mon FPGA ? [![Il est pas beau mon FPGA ?](https://i.zcraft.fr/mini_5252981572824732.png)](https://i.zcraft.fr/5252981572824732.png) Et voici la simulation du circuit configuré pour faire un « OU » logique : [![Il est pas beau mon FPGA ?](https://i.zcraft.fr/mini_8726521572825235.png)](https://i.zcraft.fr/8726521572825235.png) # Licence Depuis le début, je parle de Libre. Mais je n’ai pas encore évoqué la licence choisie. Pour le moment, tous les projets (OFP, kFPGA et k1g1) sont sous [licence CeCILL-B](https://cecill.info/licences.fr.html). # Le futur À terme, j’aimerais créer une entreprise vendant du support autour du projet OFP (création d’architectures spécifiques, réalisation des implémentations physiques…). Une fois que l’architecture sera suffisamment avancée, j’aimerais monter un financement participatif afin de financer la fabrication de FPGA ([eFabless](https://efabless.com/) propose des prix intéressants et se base sur un flot de conception libre) à destination des hobbyistes, dans le double objectif de participer au Libre et de faire ma pub. Mais on n’y est pas encore… # Sources Tous les projets sont auto‐hébergés sur mon instance [Gitea](https://gitea.com/) : - [Open FPGA Platform](https://git.slaanesh.org/open-fpga-platform/ofp) ; - [kFPGA architecture](https://git.slaanesh.org/open-fpga-platform/kfpga) ; - [kFPGA k1g1 core](https://git.slaanesh.org/open-fpga-platform/kfpga-core-k1g1). # Quelles sont les technos utilisées ? Jusqu’à présent, je n’ai pas trop parlé du code derrière Open FPGA Platform. Tout simplement parce que je suis en plein prototypage et que rien n’est stabilisé. Ça marche, mais c’est moche et fortement couplé. Mais pour l’instant, j’utilise : - du Python et le moteur de gabarits [Jinja2](https://palletsprojects.com/p/jinja/), pour générer le [RTL](https://fr.wikipedia.org/wiki/Register_Transfer_Level "Register Transfer Level") des FPGA ; - [qflow](http://opencircuitdesign.com/qflow/), pour faire des implémentations physiques  ; - [Xilinx Vivado](https://en.wikipedia.org/wiki/Xilinx_Vivado), pour faire des implémentations à destination des FPGA Xilinx et pour valider syntaxiquement le code généré ; - [cocotb](https://cocotb.readthedocs.io/en/latest/), pour créer les bancs de test ; - le simulateur [Icarus Verilog](http://iverilog.icarus.com/) ; - le visionneur de signaux [GTKWave](http://gtkwave.sourceforge.net/).