{"id":1580,"date":"2020-07-17T20:41:20","date_gmt":"2020-07-17T19:41:20","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=1580"},"modified":"2020-07-17T20:42:06","modified_gmt":"2020-07-17T19:42:06","slug":"cocotb-1-4-0-la-maturite","status":"publish","type":"post","link":"https:\/\/www.fabienm.eu\/flf\/cocotb-1-4-0-la-maturite\/","title":{"rendered":"CocoTB 1.4.0, la maturit\u00e9"},"content":{"rendered":"\n<p><a href=\"https:\/\/linuxfr.org\/news\/cocotb-1-4-0-la-maturite\">[D\u00e9p\u00eache publi\u00e9e initialement sur LinuxFR]<\/a><\/p>\n\n\n\n<p>C\u2019est dans la soir\u00e9e du 8&nbsp;juillet que l\u2019annonce est tomb\u00e9e&nbsp;: la version&nbsp;1.4.0 de CocoTB est sortie. Cette nouvelle version est une belle \u00e9volution de Cocotb avec une bonne int\u00e9gration dans le syst\u00e8me de paquets de Python ainsi que l\u2019abandon de la prise en charge de Python\u202f2. On peut aujourd\u2019hui dire que CocoTB est une alternative s\u00e9rieuse pour \u00e9crire ses bancs de test&nbsp;HDL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sommaire<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/linuxfr.org\/news\/cocotb-1-4-0-la-maturite#toc-mais-questce-quecest\">Mais qu\u2019est\u2011ce que&nbsp;c\u2019est\u202f?<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/cocotb-1-4-0-la-maturite#toc-les-changements-dans-le-code\">Les changements dans le code<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/cocotb-1-4-0-la-maturite#toc-installation\">Installation<\/a><\/li><li><a href=\"https:\/\/linuxfr.org\/news\/cocotb-1-4-0-la-maturite#toc-une-organisation-qui-tourne\">Une organisation qui tourne<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-mais-questce-quecest\">Mais qu\u2019est\u2011ce que&nbsp;c\u2019est\u202f?<\/h2>\n\n\n\n<p>CocoTB est une biblioth\u00e8que de cosimulation permettant d\u2019\u00e9crire (en&nbsp;Python) des bancs de test pour la simulation num\u00e9rique <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Langage_de_description_de_mat%C3%A9riel\">HDL<\/a> (<em>Hardware Description Language<\/em>). Historiquement, les deux langages de descriptions HDL que sont <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Verilog\">Verilog<\/a> et <a href=\"https:\/\/fr.wikipedia.org\/wiki\/VHDL\">VHDL<\/a> embarquent tout le n\u00e9cessaire pour \u00e9crire des stimuli permettant de tester le composant en simulation. Cela permet d\u2019avoir un seul langage pour d\u00e9crire le composant et le tester. Le simulateur ex\u00e9cutera tout cela sans&nbsp;probl\u00e8me.<\/p>\n\n\n\n<p>Mais cela am\u00e8ne beaucoup de confusion entre la partie du langage utilisable pour la simulation uniquement et la partie \u00ab&nbsp;description du mat\u00e9riel&nbsp;\u00bb. Dans le cas de la partie \u00ab&nbsp;mat\u00e9riel&nbsp;\u00bb on parle alors de code \u00ab&nbsp;synth\u00e9tisable&nbsp;\u00bb. Cette confusion entre du code synth\u00e9tisable ou non est source de grandes frustrations au moment de passer \u00e0 la synth\u00e8se. En&nbsp;effet, cette belle structure de donn\u00e9es que l\u2019on aura d\u00e9velopp\u00e9e et test\u00e9e aux petits oignons s\u2019\u00e9croulera au moment de la synth\u00e8se quand on se rendra compte que le code n\u2019est pas synth\u00e9tisable. Il faudra tout reprendre.<\/p>\n\n\n\n<p>Une des id\u00e9es derri\u00e8re CocoTB est donc de changer de langage pour la simulation, comme cela les choses sont claires&nbsp;: on utilise le VHDL ou Verilog pour la partie du composant qui est synth\u00e9tisable, et on passe au Python pour le banc de test. Ce n\u2019est pas le seul logiciel \u00e0 proposer ce genre d\u2019approche. Avec <a href=\"https:\/\/linuxfr.org\/news\/verilator-4-002\">Verilator<\/a>, par exemple, on va \u00e9crire toute la partie banc de test en&nbsp;C++ ou en SystemC. La partie synth\u00e9tisable sera \u00e9crite en Verilog et convertie en un objet C++ par&nbsp;Verilator.<\/p>\n\n\n\n<p>La seconde id\u00e9e de CocoTB&nbsp;est de ne pas r\u00e9inventer la roue en r\u00e9\u00e9crivant un \u00e9ni\u00e8me simulateur HDL. Ce qui \u00e9vite \u00e9galement d\u2019avoir \u00e0 choisir son camp entre Verilog et VHDL ou les deux (simulation mixte). Non, CocoTB va se contenter de piloter les simulateurs disponibles sur le march\u00e9. Les simulateurs libres que sont <a href=\"https:\/\/github.com\/ghdl\/ghdl\">GHDL<\/a>, <a href=\"https:\/\/github.com\/steveicarus\/iverilog\">Icarus<\/a> et <a href=\"https:\/\/www.veripool.org\/wiki\/verilator\">Verilator<\/a> sont naturellement pris en charge, m\u00eame si dans le cas de Verilator c\u2019est tr\u00e8s r\u00e9cent. La plupart des simulateurs commerciaux le sont \u00e9galement, ce qui est un argument pour l\u2019introduire dans son bureau d\u2019\u00e9tude. En&nbsp;effet, les managers sont en g\u00e9n\u00e9ral moyennement chauds pour virer un logiciel acquis \u00e0 grands frais. Et l\u2019on peut continuer \u00e0 profiter des interfaces propos\u00e9es par notre simulateur habituel pour ex\u00e9cuter le simulateur, visionner les chronogrammes, faire de la couverture de tests, etc.<br>La version&nbsp;1.4 de CocoTB introduit la gestion compl\u00e8te du simulateur <a href=\"https:\/\/www.aldec.com\/en\/products\/fpga_simulation\/active_hdl_student\">Aldec&nbsp;Active&nbsp;HDL<\/a> qui vient s\u2019ajouter aux classiques de Cadence et de Mentor, Modelsim\u2026<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-les-changements-dans-le-code\">Les changements dans le code<\/h2>\n\n\n\n<p>Un gros changement initi\u00e9 depuis quelque versions d\u00e9j\u00e0 est l\u2019utilisation du mot clef <code>async<\/code> en lieu et place du <code>yield<\/code> et du d\u00e9corateur <code>@coroutine<\/code>. Python\u202f3 g\u00e9rant d\u00e9sormais l\u2019asynchronisme, CocoTB l\u2019utilise et le prend d\u00e9sormais compl\u00e8tement en charge. L\u2019exemple donn\u00e9 dans le courriel de la publication est le&nbsp;suivant&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @cocotb.test()\n    async def my_first_test(dut):\n         \"\"\"Try accessing the design.\"\"\"\n\n         dut._log.info(\"Running test!\")\n         for cycle in range(10):\n             dut.clk &lt;= 0\n             await Timer(1, units='ns')\n             dut.clk &lt;= 1\n             await Timer(1, units='ns')\n         dut._log.info(\"Running test!\")<\/code><\/pre>\n\n\n\n<p>Qui se serait \u00e9crit comme cela dans \u00ab&nbsp;l\u2019ancien&nbsp;syst\u00e8me&nbsp;\u00bb&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @cocotb.test()\n    def my_first_test(dut):\n        \"\"\"Try accessing the design.\"\"\"\n         dut._log.info(\"Running test!\")\n         for cycle in range(10):\n             dut.clk &lt;= 0\n             yield Timer(1, units='ns')\n             dut.clk &lt;= 1\n             yield Timer(1, units='ns')\n         dut._log.info(\"Running test!\")<\/code><\/pre>\n\n\n\n<p>Cette \u00e9criture restant cependant valable.<\/p>\n\n\n\n<p>Le gros avantage de cette nouvelle \u00e9criture est de ne plus avoir a r\u00e9inventer la roue avec des d\u00e9corateurs inutiles. Avec <code>async<\/code> et <code>await<\/code>, on utilise des interfaces int\u00e9gr\u00e9es \u00e0 Python\u202f3, ce qui \u00e9vite tout un travail de&nbsp;gestion.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-installation\">Installation<\/h2>\n\n\n\n<p>CocoTB est, depuis maintenant un certain temps, partie int\u00e9grante du syst\u00e8me de gestion de paquets de Python <strong>pip<\/strong>. Et vous pouvez d\u00e8s \u00e0 pr\u00e9sent l\u2019installer sur votre syst\u00e8me via la commande <code>pip&nbsp;install<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    $ python -m pip install cocotb\n    # Pour celles et ceux qui ont install\u00e9 la version pr\u00e9c\u00e9dente n\u2019oubliez pas le --upgrade\n    $ python -m pip install --upgrade cocotb<\/code><\/pre>\n\n\n\n<p>Et on peut v\u00e9rifier la version gr\u00e2ce \u00e0 la commande <code>cocotb-config<\/code> suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cocotb-config --version\n1.4.0\n<\/code><\/pre>\n\n\n\n<p>En plus de votre composant \u00e9crit en VHDL ou Verilog, deux fichiers suppl\u00e9mentaires sont n\u00e9cessaires pour tester avec CocoTB&nbsp;: le Makefile et le script Python de test proprement dit.<\/p>\n\n\n\n<p>Avec cette nouvelle version, le Makefile a encore \u00e9t\u00e9 simplifi\u00e9 puisqu\u2019il n\u2019est plus n\u00e9cessaire d\u2019int\u00e9grer les en\u2011t\u00eates C++. Ces en\u2011t\u00eates sont n\u00e9cessaires pour compiler les interfaces VPI\/VHPI\/FLI qui permettent de piloter les simulateurs. On compile d\u00e9sormais cette partie \u00e0 l\u2019installation de CocoTB. Dans les pr\u00e9c\u00e9dentes version, cette compilation ce faisait \u00e0 chaque fois que l\u2019on relan\u00e7ait les&nbsp;tests.<\/p>\n\n\n\n<p>Si l\u2019on prend l\u2019exemple de l\u2019antirebond en Verilog du <a href=\"https:\/\/github.com\/Martoni\/blp\/tree\/master\/verilog\/cocotb\">Blinking&nbsp;Led&nbsp;Project<\/a>, nous avons le Makefile suivant&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    SIM=icarus                                   #\u00a0Nom du simulateur\n    export COCOTB_REDUCED_LOG_FMT=1              # Pour avoir des traces de log qui rentre dans l\u2019\u00e9cran\n    VERILOG_SOURCES = $(PWD)\/..\/src\/button_deb.v # Inclusion des fichiers HDL\n    TOPLEVEL=button_deb                          # Nom de l\u2019entit\u00e9 \n    MODULE=test_$(TOPLEVEL)                      # Nom du script Python de test\n    include $(shell cocotb-config --makefile)\/Makefile.sim<\/code><\/pre>\n\n\n\n<p>L\u2019exemple est un composant permettant de ne pas compter les rebonds d\u2019un bouton comme des appuis successifs.<br>Le script de test en Python se trouve dans le d\u00e9p\u00f4t Git du projet et se nomme <code>test_buton_deb.py<\/code>. Pour le lancer, il suffit de se rendre dans le r\u00e9pertoire <code>blp\/verilog\/cocotb\/<\/code> et de taper <code>make<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>     $ make\n     &#91;...]\n     0.00ns INFO     Running test!\n     0.00ns INFO     freq value : 95000 kHz\n     0.00ns INFO     debounce value : 20 ms\n     0.00ns INFO     Period clock value : 10000 ps\n     0.02ns INFO     Reset complete<\/code><\/pre>\n\n\n\n<p>Un fichier de traces (chronogrammes) <code>button_deb.vcd<\/code> au format VCD est cr\u00e9\u00e9. Il peut \u00eatre visionn\u00e9 en \u00ab&nbsp;temps&nbsp;r\u00e9el&nbsp;\u00bb alors m\u00eame que la simulation n\u2019est pas termin\u00e9e, gr\u00e2ce au visualiseur <code>gtkwave<\/code>&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   $ gtkwave button_deb.vcd<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/img.linuxfr.org\/img\/687474703a2f2f7777772e66616269656e6d2e65752f706172746167652f67746b776176655f636f636f74622e706e67\/gtkwave_cocotb.png\" alt=\"Vue de traces VCD avec GTKWave\" title=\"Source : http:\/\/www.fabienm.eu\/partage\/gtkwave_cocotb.png\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"toc-une-organisation-qui-tourne\">Une organisation qui tourne<\/h2>\n\n\n\n<p>Le projet CocoTB est chapeaut\u00e9 par la <a href=\"https:\/\/fossi-foundation.org\/\">FOSSi&nbsp;foundation<\/a> qui fournit le \u00ab&nbsp;chef de&nbsp;projet&nbsp;\u00bb <a href=\"https:\/\/www.philipp-wagner.com\/\">Philipp&nbsp;Wagner<\/a> ainsi que des moyens financiers pour faire tourner des machines virtuelles de tests ainsi que pour payer les licences des simulateurs commerciaux.<\/p>\n\n\n\n<p>Les statistiques de modification de cette version sont les suivantes&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>346&nbsp;fichiers modifi\u00e9s, 14\u202f012&nbsp;insertions&nbsp;(+), 10\u202f356&nbsp;suppressions&nbsp;(\u2212)\u202f;<\/li><li>554&nbsp;<em>commits<\/em>\u202f;<\/li><li>31&nbsp;contributeurs\u202f;<\/li><li>2&nbsp;nouveaux mainteneurs&nbsp;: <a href=\"https:\/\/libraries.io\/github\/cmarqu\">Colin&nbsp;Marquardt<\/a> et <a href=\"https:\/\/github.com\/ktbarrett\">Kaleb&nbsp;Barrett<\/a>.<\/li><\/ul>\n\n\n\n<p>Ces chiffres montrent que CocoTB est un projet qui f\u00e9d\u00e8re d\u00e9sormais une grosse communaut\u00e9. C\u2019est un projet mature qui compte dans le paysage des logiciels libres pour le mat\u00e9riel (<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Circuit_logique_programmable\">FPGA<\/a>&nbsp;et&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Application-specific_integrated_circuit\">ASIC<\/a>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[D\u00e9p\u00eache publi\u00e9e initialement sur LinuxFR] C\u2019est dans la soir\u00e9e du 8&nbsp;juillet que l\u2019annonce est tomb\u00e9e&nbsp;: la version&nbsp;1.4.0 de CocoTB est sortie. Cette nouvelle version est une belle \u00e9volution de Cocotb avec une bonne int\u00e9gration dans le syst\u00e8me de paquets de Python ainsi que l\u2019abandon de la prise en charge de Python\u202f2. On peut aujourd\u2019hui dire &hellip; <a href=\"https:\/\/www.fabienm.eu\/flf\/cocotb-1-4-0-la-maturite\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">CocoTB 1.4.0, la maturit\u00e9<\/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":[22,65,9],"tags":[55,31,56,28,29],"class_list":["post-1580","post","type-post","status-publish","format-standard","hentry","category-blog","category-cocotb","category-outils","tag-cocotb","tag-icarus","tag-python","tag-simulation","tag-verilator"],"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 publi\u00e9e initialement sur LinuxFR] C\u2019est dans la soir\u00e9e du 8&nbsp;juillet que l\u2019annonce est tomb\u00e9e&nbsp;: la version&nbsp;1.4.0 de CocoTB est sortie. Cette nouvelle version est une belle \u00e9volution de Cocotb avec une bonne int\u00e9gration dans le syst\u00e8me de paquets de Python ainsi que l\u2019abandon de la prise en charge de Python\u202f2. On peut aujourd\u2019hui dire\u2026","_links":{"self":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1580","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=1580"}],"version-history":[{"count":1,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1580\/revisions"}],"predecessor-version":[{"id":1581,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/1580\/revisions\/1581"}],"wp:attachment":[{"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=1580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=1580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=1580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}