{"id":1760,"date":"2021-08-13T14:32:07","date_gmt":"2021-08-13T13:32:07","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=1760"},"modified":"2021-08-13T14:33:58","modified_gmt":"2021-08-13T13:33:58","slug":"convertir-du-vhdl-en-verilog-librement-avec-yosys-et-ghdl","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/flf\/convertir-du-vhdl-en-verilog-librement-avec-yosys-et-ghdl\/","title":{"rendered":"Convertir du VHDL en Verilog librement avec Yosys et GHDL"},"content":{"rendered":"\n<p>Il y a quelques ann\u00e9es, nous parlions de l&rsquo;utilitaire <a href=\"http:\/\/www.fabienm.eu\/flf\/vhd2vl-convertir-du-vhdl-en-verilog\/\">vhdl2vl<\/a> sur ce blog. Cette solution est  int\u00e9ressante mais limit\u00e9e car le projet est relativement au point mort.<\/p>\n\n\n\n<p>Depuis quelques mois une solution beaucoup plus \u00abhype\u00bb est disponible, alliant le couteau suisse du Verilog <a href=\"http:\/\/www.clifford.at\/yosys\/\">Yosys<\/a>, la r\u00e9f\u00e9rence en simulation libre en VHDL <a href=\"https:\/\/github.com\/ghdl\/ghdl\">GHDL<\/a> et  le plugin <a href=\"https:\/\/github.com\/ghdl\/ghdl-yosys-plugin\">ghdl-yosys-plugin<\/a>. Cette solution permet d\u00e8s \u00e0 pr\u00e9sent de convertir la plupart des codes VHDL en Verilog.<\/p>\n\n\n\n<p>Voyons comment faire avec le module de r\u00e9ception uart propos\u00e9 par nandland : <a href=\"https:\/\/www.nandland.com\/vhdl\/modules\/module-uart-serial-port-rs232.html\">UART_RX.vhd<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mkdir vhdlconv\n$ cd vhdlconv\n$ ls\nUART_RX.vhd<\/code><\/pre>\n\n\n\n<p>Il faut tout d&rsquo;abord compiler et installer <a href=\"http:\/\/www.clifford.at\/yosys\/download.html\">Yosys<\/a> et <a href=\"https:\/\/github.com\/ghdl\/ghdl#building-ghdl\">GHDL<\/a> selon la proc\u00e9dure donn\u00e9e sur les sites respectif. <\/p>\n\n\n\n<p>Un fois fait il faut installer et compiler le plugin <a href=\"https:\/\/github.com\/ghdl\/ghdl-yosys-plugin#build-as-a-module-shared-library\">ghdl-yosys-plugin<\/a> comme expliqu\u00e9 sur le d\u00e9pot. Dans notre cas, cette compilation sera faite dans le r\u00e9pertoire \/opt\/ghdl-yosys-plugin.<\/p>\n\n\n\n<p>Un fois l&rsquo;installation effectu\u00e9e nous pouvons nous  lancer dans la conversion avec le plugin :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ export GHDL_YOSYS_PLUGIN=\/opt\/ghdl-yosys-plugin\/ghdl.so<\/code><\/pre>\n\n\n\n<p>On \u00e9labore le vhdl avec ghdl :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ghdl -a UART_RX.vhd \n$ ls\nUART_RX.vhd  work-obj93.cf<\/code><\/pre>\n\n\n\n<p>On lance yosys avec le module ghdl :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ yosys -m $GHDL_YOSYS_PLUGIN \n...\n |  yosys -- Yosys Open SYnthesis Suite                                       \n |  Copyright (C) 2012 - 2020  Claire Xenia Wolf &lt;claire@yosyshq.com&gt;         \n...\n Yosys 0.9+4081 (git sha1 862e84eb, clang 10.0.0-4ubuntu1 -fPIC -Os)\n<\/code><\/pre>\n\n\n\n<p>On lit le module fra\u00eechement \u00e9labor\u00e9:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\nyosys&gt; ghdl UART_RX\n1. Executing GHDL.\nImporting module UART_RX.<\/code><\/pre>\n\n\n\n<p>Puis on lance la synth\u00e8se :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; proc; opt; fsm; opt; memory; opt;\n\n2. Executing PROC pass (convert processes to netlists).\n\n2.1. Executing PROC_CLEAN pass (remove empty switches from decision trees).\nCleaned up 0 empty switches.\n\n2.2. Executing PROC_RMDEAD pass (remove dead branches from decision trees).\nRemoved a total of 0 dead cases.\n\n&#91;...]\n\n7.8. Executing OPT_EXPR pass (perform const folding).\nOptimizing module UART_RX.\n\n7.9. Finished OPT passes. (There is nothing left to do.)\n<\/code><\/pre>\n\n\n\n<p>Et enfin, on peut \u00e9crire le Verilog du module converti :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yosys&gt; write_verilog UART_RX.v\n\n8. Executing Verilog backend.\nDumping module `\\UART_RX'.\n\nyosys&gt; exit<\/code><\/pre>\n\n\n\n<p>Le module verilog ainsi g\u00e9n\u00e9r\u00e9 poss\u00e8de les m\u00eame noms d&rsquo;interfaces:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ head -n 20 UART_RX.v\n\/* Generated by Yosys 0.9+4081 (git sha1 862e84eb, clang 10.0.0-4ubuntu1 -fPIC -Os) *\/\n\nmodule UART_RX(i_Clk, i_RX_Serial, o_RX_DV, o_RX_Byte);\n  (* unused_bits = \"7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\" *)\n  wire &#91;31:0] _00_;\n  wire &#91;2:0] _01_;\n  wire &#91;6:0] _02_;\n  wire _03_;\n  wire _04_;\n  wire _05_;\n  (* unused_bits = \"3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\" *)\n  wire &#91;31:0] _06_;\n  wire &#91;2:0] _07_;\n  wire &#91;2:0] _08_;\n  wire &#91;2:0] _09_;\n  wire &#91;6:0] _10_;\n  wire &#91;2:0] _11_;\n  wire _12_;\n  wire &#91;2:0] _13_;\n  wire _14_;\n\n$ head -n 20 UART_RX.vhd\nlibrary ieee;\nuse ieee.std_logic_1164.ALL;\nuse ieee.numeric_std.all;\n \nentity UART_RX is\n  generic (\n    g_CLKS_PER_BIT : integer := 115     -- Needs to be set correctly\n    );\n  port (\n    i_Clk       : in  std_logic;\n    i_RX_Serial : in  std_logic;\n    o_RX_DV     : out std_logic;\n    o_RX_Byte   : out std_logic_vector(7 downto 0)\n    );\nend UART_RX;\n \n \narchitecture rtl of UART_RX is\n \n  type t_SM_Main is (s_Idle, s_RX_Start_Bit, s_RX_Data_Bits,\n<\/code><\/pre>\n\n\n\n<p>Et m\u00eame si le code n&rsquo;est pas tr\u00e8s lisible on retrouve ses petits avec le nom des signaux interne du module.<\/p>\n\n\n\n<p>Ce qui est vraiment int\u00e9ressant ici c&rsquo;est que le code verilog g\u00e9n\u00e9r\u00e9 est parfaitement synth\u00e9tisable avec n&rsquo;importe quel logiciel de synth\u00e8se verilog, on peut \u00e9galement utiliser <a href=\"http:\/\/www.fabienm.eu\/flf\/verilator-4-002\/\">Verilator<\/a> pour acc\u00e9l\u00e9rer nos simulation et enfin il est possible de faire de<a href=\"https:\/\/connect.ed-diamond.com\/Hackable\/HK-037\/De-la-preuve-formelle-en-Verilog-librement\"> la preuve formelle avec Yosys<\/a>.<\/p>\n\n\n\n<p> Plus d&rsquo;excuse pour ne pas mixer du code VHDL avec du Verilog maintenant puisque tout est convertible en Verilog !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il y a quelques ann\u00e9es, nous parlions de l&rsquo;utilitaire vhdl2vl sur ce blog. Cette solution est int\u00e9ressante mais limit\u00e9e car le projet est relativement au point mort. Depuis quelques mois une solution beaucoup plus \u00abhype\u00bb est disponible, alliant le couteau suisse du Verilog Yosys, la r\u00e9f\u00e9rence en simulation libre en VHDL GHDL et le plugin &hellip; <a href=\"http:\/\/www.fabienm.eu\/flf\/convertir-du-vhdl-en-verilog-librement-avec-yosys-et-ghdl\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Convertir du VHDL en Verilog librement avec Yosys et GHDL<\/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":[205,59,204,30,60,45],"class_list":["post-1760","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-convertion","tag-ghdl","tag-ghdl-yosys-plugin","tag-verilog","tag-vhdl","tag-yosys"],"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":"http:\/\/www.fabienm.eu\/flf\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"Il y a quelques ann\u00e9es, nous parlions de l&rsquo;utilitaire vhdl2vl sur ce blog. Cette solution est int\u00e9ressante mais limit\u00e9e car le projet est relativement au point mort. Depuis quelques mois une solution beaucoup plus \u00abhype\u00bb est disponible, alliant le couteau suisse du Verilog Yosys, la r\u00e9f\u00e9rence en simulation libre en VHDL GHDL et le plugin\u2026","_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1760","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/comments?post=1760"}],"version-history":[{"count":7,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1760\/revisions"}],"predecessor-version":[{"id":1774,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1760\/revisions\/1774"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=1760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=1760"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=1760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}