Comprendre Verilog
À quoi sert Verilog, comment il décrit un circuit et où il intervient dans un projet FPGA.
Un langage pour décrire du matériel
Verilog est un langage de description matérielle. Une ligne de Verilog ne demande pas forcément à un processeur d'exécuter une opération après une autre. Elle peut décrire une porte logique, un fil, une bascule ou plusieurs blocs actifs en même temps.
Le langage sert principalement à :
- décrire un circuit numérique ;
- vérifier son comportement par simulation ;
- synthétiser la partie RTL vers des ressources FPGA ou des cellules ASIC ;
- relire et maintenir une architecture sous forme de texte.
Le Verilog classique a été normalisé dans la série IEEE 1364. Il a ensuite été intégré à SystemVerilog, défini par IEEE 1800. Dans ce parcours, les fichiers utilisent l'extension .v et une syntaxe Verilog-2001 largement comprise par les outils FPGA.
Un premier module
Un module regroupe une interface et le circuit associé. Voici un verrou très simple : la sortie vaut 1 lorsque le badge est reconnu et que la porte est fermée.
module access_ok (
input wire i_badge,
input wire i_door_closed,
output wire o_unlock
);
assign o_unlock = i_badge & i_door_closed;
endmodulei_badge et i_door_closed sont les entrées. o_unlock est la sortie. L'instruction assign décrit une liaison combinatoire active en permanence.
Si une entrée change, la valeur logique de la sortie est recalculée. Ce n'est pas une fonction appelée une seule fois.
Penser en parallèle
Dans le module suivant, les deux sorties sont indépendantes :
module safety_flags (
input wire i_overtemp,
input wire i_fan_fault,
input wire i_power_good,
output wire o_shutdown,
output wire o_ready
);
assign o_shutdown = i_overtemp | i_fan_fault;
assign o_ready = i_power_good & ~o_shutdown;
endmoduleLes deux assign décrivent deux morceaux de logique présents en même temps. Leur ordre dans le fichier ne crée pas un ordre d'exécution.
Le second calcul dépend toutefois du signal o_shutdown. Cette dépendance vient du circuit décrit, pas de la position des lignes.
Simulation et synthèse
La simulation exécute un modèle pour observer ses sorties dans différents cas. Elle permet de repérer une erreur de logique avant de programmer une carte.
La synthèse transforme le RTL compatible en portes, bascules, mémoires et autres ressources. Tout ce qui peut être simulé n'est pas forcément synthétisable. Par exemple, un délai écrit avec #10 est utile dans certains testbenches, mais il ne crée pas à lui seul un délai physique précis dans le FPGA.
Un flot simple ressemble à ceci :
- écrire les besoins et l'interface ;
- décrire le RTL ;
- vérifier le comportement ;
- synthétiser le circuit ;
- placer et router les ressources ;
- générer puis charger le bitstream.
Le module de test
Le circuit à vérifier est souvent appelé DUT, pour Design Under Test. Un autre module lui applique des entrées et contrôle ses sorties.
Le DUT doit rester séparé du code de test. Les temporisations, les messages d'affichage et les scénarios de stimulation appartiennent normalement au testbench, pas au RTL destiné à la synthèse.
Verilog et VHDL
Verilog et VHDL permettent tous les deux de décrire du RTL. Verilog est généralement plus compact et plus permissif. Cette souplesse rend les tailles de vecteurs et les nombres signés particulièrement importants.
Le choix du langage ne remplace pas la conception du circuit. Dans les deux cas, il faut comprendre la logique combinatoire, les bascules, les horloges, les resets, les latences et les contraintes de timing.
À retenir
- Verilog décrit un circuit, pas un programme exécuté par un CPU.
- Plusieurs instructions peuvent représenter du matériel actif en parallèle.
- La simulation vérifie un modèle ; la synthèse construit une représentation matérielle.
- Le RTL et le testbench n'ont pas les mêmes contraintes.
- Ce parcours utilise une syntaxe Verilog-2001 dans des fichiers
.v.
📝 Tester mes connaissances - Quiz du chapitre