URL: https://linuxfr.org/users/killruana/journaux/k1g1-le-premier-fpga-libre Title: k1g1 : le premier FPGA Libre... Authors: jtremesay Date: 2019年11月04日T01:35:49+01:00 License: CC By-SA Tags: qflow, yosys, open_hardware, fpga, kfpga, ofp et open_fpga_platform Score: 84 ...à ma connaissance (la dernière fois que j'ai regardé, il n'y en avait pas d'autres) Camarades moules, 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, j'ignore la traduction exacte) 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 ASICs, les processeurs et les FPGAs ## ASIC Les ASIC (Application-Specific integrated circuit) sont des circuits intégrés dédiés à une application donnée tel 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 performant et plus efficace 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é 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 performant et consomment plus d’énergie. ## FPGA Les FPGA (Field-Programmable Gate Array) sont un compromis entre les ASICs et les processeurs. Tout comme les processeurs, ils sont reprogrammable et comme les ASICs ils sont performant (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. Je laisse les moules plus compétentes que moi en pédagogie faire une meilleure explication dans les commentaires :) # Mais pourquoi me suis-je lancé 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)). 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) des fondeurs sont propriétaires, les FPGAs sont propriétaires et les outils pour programmer les FPGAs 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'outil libre ayant a 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 du 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 CPU Intel et ARM utilisait OFP pour se créer un processeur compatible Intel composé de 8 cœurs de calcul et un autre compatible ARM bi-core, 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écifique à ces processeurs. ### Génération du [RTL](https://fr.wikipedia.org/wiki/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 supporté comme langage cible. ### Implémentation Pour les flots de conception, je vais prochainement intégrer le support de [qflow](http://opencircuitdesign.com/qflow/) pour les implémentations physique et le support de Vivado de Xilinx pour cibler leurs FPGA. Le support 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 le support 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 3 principaux éditeurs d'outil 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é à réaliser un 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. En attendant, je fais la programmation à la main et c'est _un peu_ relou... Voir [ici](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é 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 switchbox pour le routage et d'un cluster d'éléments logiques (LookUp Table suivi d'une Flip-Flop débrayable). [![Architecture kFPGA](https://i.zcraft.fr/mini_9750631572823407.png)](https://i.zcraft.fr/9750631572823407.png) [![détail d'une tuile](https://i.zcraft.fr/mini_4752661572823453.png)](https://i.zcraft.fr/4752661572823453.png) Tous les éléments sont paramétrable : le nombre de tuiles, le nombre d'élément logique par tuile, la taille des LUT dans les éléments logique, la taille des bus d’interconnexion entre les tuiles, le nombre d'entrées/sorties du cœur, le nombre de 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 RAM, DSP de multiplication, nouvel élément logique plus polyvalent, ...). Pour l'instant, il s'agit surtout d'un PoC 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 à deux entrées (là où la concurrence propose généralement de 4k à 150k éléments logiques constitués de LUT à 6 entrées...), et une paire d'entrée/sortie par face. Bref, c'est le minimum syndical pour valider le concept En utilisant la chaîne d'outil libre qflow, j'ai pu réaliser une implémentation physique utilisant la bibliothèque de portes logiques OSU 0.350um. Le circuit obtenu est composé de 139 portes logiques, fait 208.0x130.0um soit 27040.0um2 (0.02704mm2) et peut tourner à la fréquence maximale de 200MHz. 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 OR 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 choisi. 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'aimerai crée 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é, j'aimerai monter crowfunding 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 y est pas encore... # Sources Tous les projets sont auto-hébergé 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) # Quels sont les technos utilisés ? Dans ce journal, 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 template [Jinja2](https://palletsprojects.com/p/jinja/) pour générer le RTL des FPGA - qflow pour faire des implémentations physique - Xilinx Vivado pour faire des implémentation à 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 [iverilog](http://iverilog.icarus.com/) - le visualiseur de signaux [GTKWave](http://gtkwave.sourceforge.net/)

AltStyle によって変換されたページ (->オリジナル) /