{"id":1849,"date":"2021-10-04T11:46:43","date_gmt":"2021-10-04T10:46:43","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=1849"},"modified":"2021-10-04T11:46:44","modified_gmt":"2021-10-04T10:46:44","slug":"sortie-de-la-version-0-10-de-yosys","status":"publish","type":"post","link":"https:\/\/www.fabienm.eu\/flf\/sortie-de-la-version-0-10-de-yosys\/","title":{"rendered":"Sortie de la version 0.10 de Yosys"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/linuxfr.org\/news\/sortie-de-la-version-0-10-de-yosys\">[D\u00e9p\u00eache paru initialement sur LinuxFR]<\/a><\/strong><\/p>\n\n\n\n<p>Yosys est devenu le pivot opensource du d\u00e9veloppement des circuits int\u00e9gr\u00e9s <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Circuit_logique_programmable\">FPGA<\/a> et <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Application-specific_integrated_circuit\">ASIC<\/a>.<\/p>\n\n\n\n<p>Le 27 septembre 2021 a \u00e9t\u00e9 publi\u00e9e la <a href=\"https:\/\/github.com\/YosysHQ\/yosys\/releases\/tag\/yosys-0.10\">nouvelle version 0.10 de Yosys<\/a> sur l\u2019h\u00e9bergeur de gestionnaire de versions GitHub.<br>Cette sortie tardive (la 0.9 date de 2019) est l\u2019occasion de parler de ce logiciel libre de synth\u00e8se Verilog, <a href=\"https:\/\/linuxfr.org\/users\/martoni\/journaux\/enfin-une-chaine-de-developpement-completement-open-source-pour-un-fpga\">pivot de la lib\u00e9ration des FPGA<\/a> (et des ASIC). Plut\u00f4t que de simplement pr\u00e9senter les changements nous allons pr\u00e9senter le logiciel et le principe de la synth\u00e8se \u00ab<a href=\"https:\/\/en.wikipedia.org\/wiki\/Register-transfer_level\">RTL<\/a>\u00bb.<\/p>\n\n\n\n<p>Le <a href=\"http:\/\/www.clifford.at\/yosys\/files\/yosys_manual.pdf\">manuel de Yosys<\/a> repr\u00e9sente les diff\u00e9rentes couches d\u2019abstractions utilis\u00e9es en conception num\u00e9rique.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f66616269656e6d2e65752f706172746167652f6c696e757866722f796f7379735f73796e7468657369735f6c6576656c732e706e67\/yosys_synthesis_levels.png\" alt=\"Couche d\u2019abstraction utilis\u00e9es en synth\u00e8se num\u00e9rique\" title=\"Source : http:\/\/fabienm.eu\/partage\/linuxfr\/yosys_synthesis_levels.png\"\/><\/figure>\n\n\n\n<p>Les couches \u00abSystem Level\u00bb et \u00abHigh Level\u00bb sont g\u00e9n\u00e9ralement des mod\u00e8les \u00e9crits en C\/C++\/OpenCV\/Matlab\/\u2026 puis convertis en mod\u00e8les \u00abBehavioral\u00bb par un humain. Il existe quelques logiciels dit de \u00absynth\u00e8se de haut niveau\u00bb qui permettent cette conversion en automatique, mais \u00e7a n\u2019est pas la panac\u00e9e, et (tr\u00e8s) souvent verrouill\u00e9 sur une seule marque de FPGA.<\/p>\n\n\n\n<p>Le niveau \u00abBehavioral\u00bb est celui dans lequel on d\u00e9crit le comportement du composant en <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Verilog\"><strong>Verilog<\/strong><\/a> ou <a href=\"https:\/\/fr.wikipedia.org\/wiki\/VHDL\"><strong>VHDL<\/strong><\/a>. Il est \u00e9galement possible aujourd\u2019hui d\u2019utiliser des langages comme <a href=\"https:\/\/clash-lang.org\/\">Clash<\/a>, <a href=\"https:\/\/www.chisel-lang.org\/\">Chisel<\/a> ou <a href=\"https:\/\/m-labs.hk\/gateware\/migen\/\">Migen<\/a>. Ces derniers g\u00e9n\u00e9reront ensuite du code Verilog au niveau \u00abRTL\u00bb.<br>Comme son nom l\u2019indique, la couche \u00abRTL\u00bb est une description au niveau \u00abtransfert de registres\u00bb. On y d\u00e9crit le comportement des registres au rythme de l\u2019horloge. Yosys utilise son propre langage nomm\u00e9 RTLIL pour cette \u00e9tape, mais il est parfaitement possible d\u2019utiliser Verilog ici.<br>Dans la couche \u00abphysique\u00bb on d\u00e9crit le syst\u00e8me au moyen de portes logiques disponibles dans le FPGA cible. \u00c0 ce niveau on parlera souvent de \u00abnetlist\u00bb. Cette netlist est souvent d\u00e9crite au format <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Electronic_Design_Interchange_Format\">EDIF<\/a>, mais il est possible de la d\u00e9crire en Verilog ou VHDL. Yosys propose \u00e9galement le format <a href=\"https:\/\/fr.wikipedia.org\/wiki\/JavaScript_Object_Notation\">JSON<\/a> bien connu des d\u00e9veloppeurs JavaScript.<br>Le niveau \u00abswitch level\u00bb n\u2019est pas vraiment utilis\u00e9 en synth\u00e8se sur FPGA. C\u2019est la description des connexions entre transistors, elle ne fait pas vraiment de sens pour un FPGA dans la mesure o\u00f9 les cellules logiques sont fig\u00e9es dans le FPGA.<\/p>\n\n\n\n<p>Arriv\u00e9 au niveau portes (Physical Gate level) on quitte la synth\u00e8se \u2013 et donc yosys \u2013 pour passer \u00e0 la mise en paquet (Pack), au placement puis au routage. Et on s\u2019enfonce dans la jungle sombre et humide des logiciels gratuits-mais-pas-trop non libres fournis par les constructeurs. Il existe toutefois un logiciel libre nomm\u00e9 <a href=\"https:\/\/github.com\/YosysHQ\/nextpnr\">nextpnr<\/a>, mais \u00e7a nous \u00e9loigne du sujet. Sachez juste que <strong>nextpnr<\/strong> est parfaitement utilisable pour certaines marques de FPGA (<strong>ICE40, Gowin, ECP5<\/strong> notamment).<\/p>\n\n\n\n<p>Yosys est un logiciel de synth\u00e8se <strong>Verilog<\/strong>, il prend en entr\u00e9e un source Verilog dans la couche \u00abBehavioral Level\u00bb pour descendre dans les couches jusqu\u2019au niveau \u00abPhysical Gate\u00bb.<\/p>\n\n\n\n<p>commen\u00e7ons donc par l\u2019exemple de l\u2019inverseur synchrone suivant (fichier <code>invert.v<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ inverseur\nmodule syncinvert(\n    input clock,\n    input reset,\n    input inval,\n    output outval);\nreg regval;\n\nassign outval = regval;\n\nalways@(posedge clock, posedge reset)\nbegin\n    if(reset)\n        regval &lt;= 1'b0;\n    else\n        regval &lt;= !inval;\nend\n\nendmodule<\/code><\/pre>\n\n\n\n<p>Par d\u00e9fault, Yosys se pr\u00e9sente sous la forme d\u2019une console \u00abREPL\u00bb (Read Eval Print Loop) et se lance en tapant son nom :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ yosys\n\n \/----------------------------------------------------------------------------\\\n |                                                                            |\n |  yosys -- Yosys Open SYnthesis Suite                                       |\n |                                                                            |\n |  Copyright (C) 2012 - 2020  Claire Xenia Wolf &lt;claire@yosyshq.com&gt;         |\n |                                                                            |\n |  Permission to use, copy, modify, and\/or distribute this software for any  |\n |  purpose with or without fee is hereby granted, provided that the above    |\n |  copyright notice and this permission notice appear in all copies.         |\n |                                                                            |\n |  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES  |\n |  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF          |\n |  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR   |\n |  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    |\n |  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN     |\n |  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   |\n |  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.            |\n |                                                                            |\n \\----------------------------------------------------------------------------\/\n\n Yosys 0.10+0 (git sha1 070cad5f4, clang 8.0.0-svn345496-1~exp1+0~20181029105533.852~1.gbpf10f36 -fPIC -Os)\n\nyosys&gt;<\/code><\/pre>\n\n\n\n<p>Premier changement de cette version : l\u2019auteur n\u2019est plus <strong>Clifford Wolf<\/strong> mais <strong>Claire Xenia Wolf<\/strong>. Si la date du d\u00e9but du copyright n\u2019a pas chang\u00e9e c\u2019est que les deux sont une seule et m\u00eame personne, elle a \u00abjuste\u00bb <a href=\"http:\/\/www.clifford.at\/\">chang\u00e9 de pr\u00e9nom<\/a> et d\u2019\u00e9tat civil.<\/p>\n\n\n\n<p>La ligne de commande se comporte comme une ligne de commande shell classique, avec le rappel des commandes par fl\u00e8che haut\/bas, et la compl\u00e9tion avec Ctrl+R et tabulation.<br>On charge son fichier source verilog avec la commande <code>read_verilog<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; read_verilog invert.v \n1. Executing Verilog-2005 frontend: invert.v\nParsing Verilog input from `invert.v' to AST representation.\nGenerating RTLIL representation for module `\\syncinvert'.\nSuccessfully finished Verilog frontend.<\/code><\/pre>\n\n\n\n<p>Yosys nous informe ici qu\u2019il a bien lu et analys\u00e9 le fichier source. Le \u00ab<a href=\"https:\/\/www.reddit.com\/r\/FPGA\/comments\/b1qiru\/definition_of_gateware\/\">gateware<\/a>\u00bb est bien conforme au standard Verilog-2005 et a \u00e9t\u00e9 converti dans le langage interne nomm\u00e9 RTLIL (RTL Intermediate Language).<\/p>\n\n\n\n<p>On peut lister les modules charg\u00e9s en m\u00e9moire gr\u00e2ce \u00e0 la commande <code>ls<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; ls\n\n1 modules:\n  syncinvert<\/code><\/pre>\n\n\n\n<p>Et afficher une vue graphique du module avec <code>show<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; show syncinvert \n\n4. Generating Graphviz representation of design.\nWriting dot description to `\/home\/fabien\/.yosys_show.dot'.\nDumping module syncinvert to page 1.\nExec: { test -f '\/home\/user\/.yosys_show.dot.pid' &amp;&amp; fuser -s '\/home\/user\/.yosys_show.dot.pid' 2&gt; \/dev\/null; } || ( echo $$ &gt;&amp;3; exec xdot '\/home\/fabien\/.yosys_show.dot'; ) 3&gt; '\/home\/user\/.yosys_show.dot.pid' &amp;<\/code><\/pre>\n\n\n\n<p>Qui affiche l\u2019image suivante<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f66616269656e6d2e65752f706172746167652f6c696e757866722f696e7665727465725f78646f742e706e67\/inverter_xdot.png\" alt=\"Rendu xdot de l\u2019inverseur\" title=\"Source : http:\/\/fabienm.eu\/partage\/linuxfr\/inverter_xdot.png\"\/><\/figure>\n\n\n\n<p>Cette simple lecture du fichier verilog nous a fait passer la premi\u00e8re \u00e9tape de la synth\u00e8se. Nous sommes presque descendus au niveau de la couche \u00abRTL\u00bb de la synth\u00e8se. Presque, car il faut encore \u00abmapper\u00bb la proc\u00e9dure que l\u2019on voit au centre avec la commande <code>proc<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; proc\n10. Executing PROC pass (convert processes to netlists).\n10.1. Executing PROC_CLEAN pass (remove empty switches from decision trees).\nCleaned up 0 empty switches.\n10.2. Executing PROC_RMDEAD pass (remove dead branches from decision trees).\nRemoved a total of 0 dead cases.\n10.3. Executing PROC_PRUNE pass (remove redundant assignments in processes).\nRemoved 0 redundant assignments.\nPromoted 0 assignments to connections.\n10.4. Executing PROC_INIT pass (extract init attributes).\n10.5. Executing PROC_ARST pass (detect async resets in processes).\n10.6. Executing PROC_MUX pass (convert decision trees to multiplexers).\n10.7. Executing PROC_DLATCH pass (convert process syncs to latches).\n10.8. Executing PROC_DFF pass (convert process syncs to FFs).\n10.9. Executing PROC_MEMWR pass (convert process memory writes to cells).\n10.10. Executing PROC_CLEAN pass (remove empty switches from decision trees).\nCleaned up 0 empty switches.\n10.11. Executing OPT_EXPR pass (perform const folding).\nOptimizing module syncinvert.<\/code><\/pre>\n\n\n\n<p>Le r\u00e9sultat ressemble beaucoup plus \u00e0 la <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Bascule_%28circuit_logique%29#Bascule_D\">bascule D<\/a> que l\u2019on conna\u00eet.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f66616269656e6d2e65752f706172746167652f6c696e757866722f796f7379735f6d61707065645f72746c2e706e67\/yosys_mapped_rtl.png\" alt=\"Rendu xdot de l\u2019inverseur \u00abmapp\u00e9\u00bb\" title=\"Source : http:\/\/fabienm.eu\/partage\/linuxfr\/yosys_mapped_rtl.png\"\/><\/figure>\n\n\n\n<p>On peut optimiser ce graphe avec la commande <code>opt<\/code>, ce qui supprimera la branche inutile <code>BUF -&gt; $0\\regval[0:0]<\/code>.<\/p>\n\n\n\n<p>S\u2019ensuit toute une s\u00e9rie de commandes d\u2019optimisation comme <code>memory<\/code> pour d\u00e9tecter les tableaux et utiliser des blocs de ram si possible ou <code>techmap<\/code> pour \u00abmapper\u00bb les cellules d\u2019une biblioth\u00e8que donn\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; opt; memory; opt; techmap; opt<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f66616269656e6d2e65752f706172746167652f6c696e757866722f796f7379735f746563686d61702e706e67\/yosys_techmap.png\" alt=\"Rendu xdot de l\u2019inverseur mapp\u00e9 avec `techmap`\" title=\"Source : http:\/\/fabienm.eu\/partage\/linuxfr\/yosys_techmap.png\"\/><\/figure>\n\n\n\n<p>Notez que toutes ces commandes \u00e9tant des commandes d\u2019optimisations, rien n\u2019interdit de les relancer pour am\u00e9liorer encore l\u2019optimisation (ici les optimisation sont totalement inutiles vu la simplicit\u00e9 du sch\u00e9ma).<\/p>\n\n\n\n<p>Beaucoup d\u2019\u00e9tapes d\u00e9pendantes de la cible sont ensuite n\u00e9cessaires pour obtenir une netlist correspondant au composant. Ces \u00e9tapes \u00e9tant diff\u00e9rentes en fonction de l\u2019architecture cible. Yosys inclut des scripts pour chaque composant support\u00e9.<\/p>\n\n\n\n<p>Par exemple, si nous voulons synth\u00e9tiser pour <a href=\"http:\/\/www.fabienm.eu\/flf\/une-led-qui-clignote-sur-icestick-vite-vite-vite\/\">icestick<\/a>, le FPGA mont\u00e9 sur la carte est un <strong>ice40<\/strong>, nous pourrons donc utiliser le script nomm\u00e9 <code>synth_ice40<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; synth_ice40 \n&#91;...]\n37.47. Printing statistics.\n\n=== syncinvert ===\n\n   Number of wires:                  6\n   Number of wire bits:              6\n   Number of public wires:           6\n   Number of public wire bits:       6\n   Number of memories:               0\n   Number of memory bits:            0\n   Number of processes:              0\n   Number of cells:                  2\n     SB_DFFR                         1\n     SB_LUT4                         1\n\n37.48. Executing CHECK pass (checking for obvious problems).\nChecking module syncinvert...\nFound and reported 0 problems.<\/code><\/pre>\n\n\n\n<p>Le lecteur attentif reconna\u00eetra la <a href=\"https:\/\/magma-mantle.readthedocs.io\/en\/stable\/ice40\/\">LUT 4 entr\u00e9es<\/a> et la basculeD de l&rsquo;<a href=\"https:\/\/www.latticesemi.com\/iCE40\">ICE40<\/a> dans le sch\u00e9ma g\u00e9n\u00e9r\u00e9 :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f66616269656e6d2e65752f706172746167652f6c696e757866722f796f7379735f69636534302e706e67\/yosys_ice40.png\" alt=\"Rendu xdot de l\u2019inverseur synth\u00e9tis\u00e9 pour ICE40\" title=\"Source : http:\/\/fabienm.eu\/partage\/linuxfr\/yosys_ice40.png\"\/><\/figure>\n\n\n\n<p>Pour connaitre les scripts de synth\u00e8se disponibles dans yosys il suffit d\u2019utiliser la compl\u00e9tion de commande avec <code>synth_<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; synth_&lt;TAB&gt;\nsynth_achronix     synth_coolrunner2  synth_ecp5         synth_gowin        synth_ice40        synth_intel_alm    synth_nexus        synth_sf2          \nsynth_anlogic      synth_easic        synth_efinix       synth_greenpak4    synth_intel        synth_machxo2      synth_quicklogic   synth_xilinx<\/code><\/pre>\n\n\n\n<p>Ce qui nous donne 16 mod\u00e8les de FPGA support\u00e9 \u00abofficiellement\u00bb par Yosys.<\/p>\n\n\n\n<p>Il n\u2019est pas obligatoire d\u2019avoir un script <code>synth_<\/code> pour pouvoir synth\u00e9tiser pour un mod\u00e8le de FPGA du moment que l\u2019on fournit la biblioth\u00e8que des primitives. <a href=\"http:\/\/pepijndevos.nl\/2019\/07\/18\/vhdl-to-pcb.html\">Pepijn De Vos<\/a> s\u2019est par exemple amus\u00e9 \u00e0 synth\u00e9tiser vers une biblioth\u00e8que de composants en logique discr\u00e8te (la s\u00e9rie des 74-* pour ceux qui connaissent un peu l&rsquo;\u00e9lectronique). Il a ensuite produit, assembl\u00e9 et soud\u00e9 la carte \u00e9lectronique correspondante.<\/p>\n\n\n\n<p>Mais! Pepijn est parti d\u2019un gateware \u00e9crit en VHDL&nbsp;! En quoi cela concerne-t-il yosys qui est cens\u00e9 \u00eatre un logiciel de synth\u00e8se <strong>Verilog<\/strong>&nbsp;?<\/p>\n\n\n\n<p>Pepijn a utilis\u00e9 pour cela une <a href=\"https:\/\/github.com\/ghdl\/ghdl-yosys-plugin\">extension de yosys<\/a> permettant de se connecter au logiciel <a href=\"https:\/\/linuxfr.org\/news\/sortie-de-ghdl-version-1-0-0\">GHDL<\/a>. Avec cette extension (encore en b\u00eata mais d\u00e9j\u00e0 bien avanc\u00e9e), le <a href=\"https:\/\/en.wikipedia.org\/wiki\/VHDL\">VHDL<\/a> est d\u00e9cod\u00e9 avec <strong>GHDL<\/strong> qui transmet ensuite les informations \u00e0 Yosys pour la synth\u00e8se. Et comme yosys est capable de sortir une version verilog de sa repr\u00e9sentation interne RTLIL, on peut s\u2019en servir pour <a href=\"http:\/\/www.fabienm.eu\/flf\/convertir-du-vhdl-en-verilog-librement-avec-yosys-et-ghdl\/\">faire de la conversion VHDL-&gt;Verilog sans probl\u00e8me<\/a>.<\/p>\n\n\n\n<p>Notre inverseur est d\u00e9sormais synth\u00e9tis\u00e9. Nous pouvons donc l\u2019enregistrer au format de notre choix pour passer ensuite au placement routage.<\/p>\n\n\n\n<p>On peut l\u2019\u00e9crire au format Verilog par exemple si nous souhaitons le simuler ou tout simplement lire la netlist :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; write_verilog invert_synth.v\n\n41. Executing Verilog backend.\nDumping module `\\syncinvert'.<\/code><\/pre>\n\n\n\n<p>Ce qui donnera les sources suivantes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* Generated by Yosys 0.10+0 (git sha1 070cad5f4, clang 8.0.0-svn345496-1~exp1+0~20181029105533.852~1.gbpf10f36 -fPIC -Os) *\/\n\n(* top =  1  *)\n(* src = \"invert.v:2.1-19.10\" *)\nmodule syncinvert(clock, reset, inval, outval);\n  (* src = \"invert.v:3.11-3.16\" *)\n  input clock;\n  (* src = \"invert.v:5.11-5.16\" *)\n  input inval;\n  (* src = \"invert.v:6.12-6.18\" *)\n  output outval;\n  (* src = \"invert.v:7.5-7.11\" *)\n  wire regval;\n  (* src = \"invert.v:11.1-17.4\" *)\n  wire regval_SB_DFFR_Q_D;\n  (* src = \"invert.v:4.11-4.16\" *)\n  input reset;\n  (* module_not_derived = 32'd1 *)\n  (* src = \"\/usr\/local\/bin\/..\/share\/yosys\/ice40\/cells_map.v:12.34-13.52\" *)\n  SB_LUT4 #(\n    .LUT_INIT(16'h00ff)\n  ) inval_SB_LUT4_I3 (\n    .I0(1'h0),\n    .I1(1'h0),\n    .I2(1'h0),\n    .I3(inval),\n    .O(regval_SB_DFFR_Q_D)\n  );\n  (* module_not_derived = 32'd1 *)\n  (* src = \"invert.v:11.1-17.4|\/usr\/local\/bin\/..\/share\/yosys\/ice40\/ff_map.v:9.57-9.103\" *)\n  SB_DFFR regval_SB_DFFR_Q (\n    .C(clock),\n    .D(regval_SB_DFFR_Q_D),\n    .Q(regval),\n    .R(reset)\n  );\n  assign outval = regval;\nendmodule<\/code><\/pre>\n\n\n\n<p>Les sources sont annot\u00e9es avec des r\u00e9f\u00e9rences au verilog initial. On rep\u00e8re bien la bascule SB_DFFR et la SB_LUT4 avec sa configuration.<br>Et dans la mesure du possible, les noms de registres ont \u00e9t\u00e9 gard\u00e9s, ce qui rend le fichier assez facile \u00e0 lire.<\/p>\n\n\n\n<p>Pour le placement routage, si on utilise <strong>nextpnr<\/strong> il faudra \u00absortir\u00bb au format json :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; write_json invert.json\n\n42. Executing JSON backend.<\/code><\/pre>\n\n\n\n<p>Le fichier <code>invert.json<\/code> est beaucoup plus large que la sortie verilog (9779 lignes).<br>Les diff\u00e9rents formats de sortie disponibles sont visibles avec la compl\u00e9tion de commande <code>write_<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; write_&lt;TAB&gt;\nwrite_aiger       write_btor        write_edif        write_firrtl      write_intersynth  write_rtlil       write_smt2        write_spice       write_verilog     \nwrite_blif        write_cxxrtl      write_file        write_ilang       write_json        write_simplec     write_smv         write_table       write_xaiger<\/code><\/pre>\n\n\n\n<p>Cette possibilit\u00e9 de convertir dans diff\u00e9rents formats le verilog initial fait de Yosys le couteau suisse du gateware. On peut s\u2019en servir pour faire de la synth\u00e8se \u00e0 destination des FPGA&nbsp;bien s\u00fbr, mais il est possible de \u00abmapper\u00bb sur d\u2019autres biblioth\u00e8ques pour faire des PCB \u00abdiscret\u00bb comme on l\u2019a vu avec Pepijn De Vos.<br>Il est \u00e9galement possible de faire de la synth\u00e8se \u00e0 destination des ASIC. Yosys est d\u2019ailleurs utilis\u00e9 par la cha\u00eene de d\u00e9veloppement opensource <a href=\"https:\/\/github.com\/The-OpenROAD-Project\/OpenLane\">OpenLane<\/a>.<\/p>\n\n\n\n<p>Enfin, les mod\u00e8les synth\u00e9tis\u00e9s par yosys peuvent servir \u00e0 faire de la preuve formelle, \u00e0 partir de <a href=\"http:\/\/www.testandverification.com\/wp-content\/uploads\/2017\/Formal_Verification\/Clifford_Wolf.pdf\">sources verilog<\/a> mais \u00e9galement <a href=\"https:\/\/vhdlwhiz.com\/formal-verification-in-vhdl-using-psl\/\">VHDL<\/a>.<\/p>\n\n\n\n<p>En r\u00e8gle g\u00e9n\u00e9rale, il n\u2019est pas n\u00e9cessaire de conna\u00eetre les d\u00e9tails des commandes de Yosys. L\u2019utilisation de yosys est enfouie dans les scripts et autres Makefile des outils utilis\u00e9s.<\/p>\n\n\n\n<p>Bref, en quelques ann\u00e9es, Yosys est devenu le pivot opensource du d\u00e9veloppement FPGA et ASIC. Il m\u00e9ritait bien une d\u00e9p\u00eache sur LinuxFr.org&nbsp;!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[D\u00e9p\u00eache paru initialement sur LinuxFR] Yosys est devenu le pivot opensource du d\u00e9veloppement des circuits int\u00e9gr\u00e9s FPGA et ASIC. Le 27 septembre 2021 a \u00e9t\u00e9 publi\u00e9e la nouvelle version 0.10 de Yosys sur l\u2019h\u00e9bergeur de gestionnaire de versions GitHub.Cette sortie tardive (la 0.9 date de 2019) est l\u2019occasion de parler de ce logiciel libre de &hellip; <a href=\"https:\/\/www.fabienm.eu\/flf\/sortie-de-la-version-0-10-de-yosys\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Sortie de la version 0.10 de Yosys<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1849","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Fabien Marteau","author_link":"https:\/\/www.fabienm.eu\/flf\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"[D\u00e9p\u00eache paru initialement sur LinuxFR] Yosys est devenu le pivot opensource du d\u00e9veloppement des circuits int\u00e9gr\u00e9s FPGA et ASIC. Le 27 septembre 2021 a \u00e9t\u00e9 publi\u00e9e la nouvelle version 0.10 de Yosys sur l\u2019h\u00e9bergeur de gestionnaire de versions GitHub.Cette sortie tardive (la 0.9 date de 2019) est l\u2019occasion de parler de ce logiciel libre de\u2026","_links":{"self":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/comments?post=1849"}],"version-history":[{"count":1,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1849\/revisions"}],"predecessor-version":[{"id":1850,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1849\/revisions\/1850"}],"wp:attachment":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=1849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=1849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=1849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}