Qu'est-ce que Verilog ?
Langage de description matérielle très utilisé pour la conception et la vérification de circuits numériques. Les circuits sont décrits par modules (module) et le comportement par assign ou always.
Nom japonais: Verilog
« Verilog » apparaît dans 21 questions d'entraînement réparties sur 2 thèmes, dont HDL et vérification, Flot de conception de circuits intégrés et EDA.
Domaine: HDL et vérification
Modules, assign et always
Une conception Verilog est construite à partir de modules, chacun étant un bloc de circuit doté de ports d'entrée et de sortie déclarés. Un module peut être instancié dans un autre autant de fois que nécessaire, ports reliés entre eux, si bien qu'une puce se décrit comme une hiérarchie de composants. À l'intérieur d'un module, une affectation continue comme assign y = (a & b) | c décrit une logique combinatoire dont la sortie suit ses entrées en permanence. Un bloc always décrit un comportement déclenché par des événements : always @(posedge clk) devient des bascules déclenchées sur front, tandis que always @(*) est réévalué dès qu'un signal qu'il lit change et décrit de la logique combinatoire.
Penser en matériel, pas en étapes
Verilog ressemble à un langage de programmation, mais chaque instruction assign et chaque bloc always fonctionnent de façon concurrente, quel que soit leur ordre dans le fichier. Dans les blocs cadencés, les affectations non bloquantes (<=) évaluent tous les membres de droite avec les valeurs d'avant le front, puis mettent à jour ensemble, à l'image de bascules qui capturent simultanément ; les affectations bloquantes (=) conviennent aux blocs combinatoires qui calculent des valeurs intermédiaires de haut en bas. Un signal déclaré reg n'est pas forcément un registre : affecté dans always @(*), il est combinatoire. Un if sans else dans un bloc combinatoire implique une mémorisation et infère un latch involontaire. Les largeurs comptent aussi, car les affectations tronquent silencieusement, et les signaux sont non signés sauf s'ils sont déclarés signed.
Sémantique de simulation et logique à quatre états
Les simulateurs Verilog sont pilotés par événements : ils ne réévaluent que la logique dont les entrées ont changé, ce qui est efficace car peu de signaux basculent à chaque cycle. Les signaux prennent quatre valeurs : 0, 1, X pour inconnu et Z pour haute impédance. Les registres non initialisés et les pilotes en conflit produisent X, et les nets non pilotés produisent Z ; voir l'une ou l'autre valeur dans un chronogramme est donc un indice de débogage précieux. Certaines sémantiques sont optimistes : une instruction if traite une condition X comme fausse, masquant des bogues que le matériel réel révélerait. L'opérateur == renvoie X lorsque les opérandes contiennent X ou Z, tandis que === les compare littéralement et n'est utilisé que dans les bancs de test.
Verilog, SystemVerilog et VHDL
Seul un sous-ensemble de Verilog est synthétisable. Les délais comme #10, $display et les entrées-sorties fichier sont réservés à la simulation et ignorés par la synthèse ; les bancs de test peuvent les utiliser librement, mais pas le RTL. SystemVerilog, la norme qui lui succède, ajoute le type logic, qui supprime l'essentiel de la distinction wire/reg, ainsi que always_ff et always_comb, qui expriment l'intention du concepteur pour que les outils puissent signaler un latch inféré. Il ajoute aussi de nombreuses fonctions de vérification comme les assertions et les classes. VHDL est l'autre grand langage de description matérielle, au typage plus strict et au style plus verbeux ; les deux sont utilisés pour la conception RTL.
Questions fréquentes
Quelle est la différence entre wire et reg en Verilog ?
Un wire est piloté par une affectation continue ou une sortie de module, tandis qu'un reg est affecté dans un bloc always ou initial. Un reg ne devient une bascule que s'il est mis à jour sur un front d'horloge ; dans always @(*), c'est de la logique combinatoire.
Quand utiliser les affectations bloquantes (=) ou non bloquantes (<=) ?
Utilisez les affectations non bloquantes dans les blocs always cadencés qui décrivent des bascules, et les affectations bloquantes dans les blocs always combinatoires. Mélanger les deux dans un même bloc ou utiliser des affectations bloquantes pour la logique séquentielle peut rendre la simulation dépendante de l'ordre des instructions et la faire différer du matériel.
Quelle est la différence entre Verilog et SystemVerilog ?
SystemVerilog est un sur-ensemble de Verilog qui ajoute des commodités de conception comme le type logic, always_ff et always_comb, ainsi que des fonctions de vérification comme les assertions, les stimuli aléatoires sous contraintes et les bancs de test orientés objet.