URL: https://linuxfr.org/news/verilator-4-002 Title: Verilator 4.002 Authors: martoni Davy Defaud, palm123, BAud, ZeroHeure, bubarđŠ„ et BenoĂźt Sibaud Date: 2018ćčŽ09æ12æ„T11:36:35+02:00 License: CC By-SA Tags: verilog, systemc, c++ et verilator Score: 29 La version 4.002 de Verilator [a Ă©tĂ© annoncĂ©e](https://www.veripool.org/papers/Verilator_v4_Multithreaded_OrConf2018.pdf) Ă la confĂ©rence [ORConf2018](https://orconf.org/) en Pologne. Verilator est sans conteste le simulateur [HDL](https://en.wikipedia.org/wiki/Hardware_description_language) _open source_ le plus rapide du « marchĂ© ». Il permet de simuler des [porteâgrammes](http://www.fabienm.eu/flf/et-pourquoi-pas-portegramme/) Ă©crits en Verilog **synthĂ©tisable**.  ---- [Page officielle de Verilator](https://www.veripool.org/wiki/verilator) [Comparaison de temps de simulation Verilator vs Icarus](http://www.fabienm.eu/flf/icarus-vs-verilator/) [Notes de version de la 4.002](https://www.veripool.org/news/241-Verilator-Verilator-4-002-Released) [La prĂ©sentation Ă ORConf2018](https://www.veripool.org/papers/Verilator_v4_Multithreaded_OrConf2018.pdf) ---- SynthĂ©tisable ? Ce point est important. En effet, le langage [Verilog](https://fr.wikipedia.org/wiki/Verilog) (tout comme son homologue VHDL) permet de dĂ©crire des modĂšles de circuits numĂ©riques destinĂ©s Ă ĂȘtre utilisĂ©s dans des [FPGA]( "FieldâProgrammable Gate Array â circuit logique programmable") mais aussi des [ASIC](https://fr.wikipedia.org/wiki/Application-specific_integrated_circuit "ApplicationâSpecific Integrated Circuit â circuit intĂ©grĂ© propre Ă une application"). En plus de la partie « modĂ©lisation », Verilog (comme VHDL) inclut la partie tests. On peut donc Ă©crire tout notre _testbench_ en Verilog, puisque nous avons des fonctions dâaffichage, dâaccĂšs aux fichiers, etc. Cependant, seule une sousâpartie du langage Verilog est capable de dĂ©crire le circuit final, câest ce quâon appelle la partie « synthĂ©tisable » car elle peut ĂȘtre synthĂ©tisĂ©e en un schĂ©ma Ă©lectronique numĂ©rique. Si verilator nâest capable de prendre en entrĂ©e que du Verilog synthĂ©tisable, câest parce quâil convertit ce code en un objet en C++ et/ou SystemC (le [SystemC](https://fr.wikipedia.org/wiki/SystemC) nâĂ©tant quâune bibliothĂšque C++). La partie code de test sera donc Ă©crite en C++/SystemC et le programme final compilĂ© avec _gcc_. Le binaire ainsi compilĂ© peut ensuite ĂȘtre exĂ©cutĂ© comme nâimporte quel exĂ©cutable et lancera la simulation de notre modĂšle numĂ©rique (le porteâgramme). Le rĂ©sultat est un temps de simulation incroyablement plus rapide quâ[avec les simulateurs classiques](https://www.veripool.org/wiki/veripool/Verilog_Simulator_Benchmarks). Le site officiel donne des vitesses 90 fois supĂ©rieures au cĂ©lĂšbre simulateur Verilog _open source_ [Icarus](http://iverilog.icarus.com/). Personnellement, sur mon porteâgramme dâantiârebond jâobtiens une vitesse 20 fois supĂ©rieure, mais câest en enregistrant des traces trĂšs lourdes (700 Mio) permettant de visualiser les signaux une fois la simulation terminĂ©e. Il est possible de faire tourner des modĂšles de microprocesseurs Ă©crit en Verilog en « temps rĂ©el » (Ă quelques kilohertz). ConcrĂštement, si lâon prend lâexemple dâun porteâgramme simple permettant de filtrer les rebonds dâun bouton (pour le code complet câest [par ici](https://github.com/Martoni/blp/blob/master/verilog/src/button_deb.v)). On aura les ports dâentrĂ©eâsortie suivants : ```verilog module button_deb( // sync design input clk, input rst, // in-out input button_in, output button_valid); ``` Une fois « compilĂ© » avec verilator : verilator -Wall -cc src/button_deb.v --trace --exe test/test_button_deb.cpp On obtient un objet que lâon peut instancier dans son programme principal : ```c++ Vbutton_deb* top = new Vbutton_deb; ``` LâaccĂšs aux signaux dâentrĂ©eâsortie se fait ensuite simplement comme un accĂšs aux variables de lâobjet : ```c++ top->rst = 1; top->button_in = 0; top->clk = 0; ``` On Ă©value les valeurs de sortie par lâappel Ă la fonction `eval()` : ```c++ top->eval(); ``` Câest cet appel Ă la fonction `eval()` qui fera avancer la simulation dâun « pas ». Ă nous de connaĂźtre le temps que nous souhaitons avoir entre deux pas. Hormis la collection de corrections de bogues, la fonctionnalitĂ© majeure de cette nouvelle version est la prise en charge de multiple fils dâexĂ©cution (_multiâthreads_), qui divise encore le temps de simulation de beaucoup, en fonction du nombre de cĆurs prĂ©sents sur sa machine. Cette nouvelle version de Verilator prouve surtout que ce vĂ©nĂ©rable projet (créé en 1994 dâaprĂšs la [page WikipĂ©dia](https://en.wikipedia.org/wiki/Verilator)) est encore largement actif, il est dĂ©sormais pris au sĂ©rieux par tous les concepteurs de matĂ©riel. Et si lâon en croit son auteur, la plupart des Ă©quipes qui conçoivent des microprocesseurs lâutilisent intensĂ©ment. Bref, un trĂšs bel exemple dâoutil de libĂ©ration des FPGA. ;)