Menu
Coddy logo textTech

Aide-mémoire Verilog

Dernière mise à jour

Structure d'un module et ports

Un module est la brique de base - il a un nom et une liste de ports.

SyntaxeSignification
module adder(...); ... endmoduleDéfinir un module et son corps
input clk;Un port d'entrée
output q;Un port de sortie
output reg q;Une sortie pilotée depuis un bloc always
input [7:0] data;Un bus d'entrée 8 bits (vecteur)
inout sda;Un port bidirectionnel
adder u1 (.a(x), .b(y), .sum(s));Instancier un module par ports nommés

Types de données

wire modélise une connexion ; reg contient une valeur affectée par du code procédural.

ÉlémentCe qu'il fait
wire w;Un net piloté par assign ou une sortie de module
reg r;Contient une valeur affectée dans un bloc always/initial
wire [3:0] bus;Un vecteur 4 bits (bits 3 à 0)
reg [7:0] count;Un registre 8 bits
bus[2]Sélectionner un seul bit
bus[3:1]Sélectionner une tranche de bits (part-select)
reg mem [0:255];Une mémoire : un tableau de registres
parameter WIDTH = 8;Une constante nommée pour le module

Littéraux numériques

Le format est <size>'<base><value> - taille en bits, base parmi b/o/d/h.

SyntaxeSignification
4'b1010Binaire 4 bits, valeur 10
8'hFFHexadécimal 8 bits, valeur 255
8'hffIdentique - les chiffres hex sont insensibles à la casse
16'd255Décimal 16 bits, valeur 255
3'o7Octal 3 bits, valeur 7
8'b1010_1100Les tirets bas groupent les chiffres pour la lisibilité
1'bxUne valeur de bit inconnue (x)
1'bzUne valeur de bit haute impédance (z)

Opérateurs

Opérateurs binaires, logiques, de comparaison et de réduction.

OpérateurCe qu'il fait
& | ^ ~ET, OU, OU exclusif, NON binaires
&& || !ET, OU, NON logiques (renvoient 1 bit)
== != < > <= >=Opérateurs de comparaison
<< >>Décalage à gauche et à droite
+ - * / %Opérateurs arithmétiques
&busET de réduction (ET de tous les bits)
|busOU de réduction (OU de tous les bits)
^busOU exclusif de réduction (parité de tous les bits)
{a, b}Concaténation ; {4{1'b1}} se réplique en 4'b1111

Affectation continue

assign pilote un wire en continu - utilisez-le pour la logique combinatoire.

SyntaxeSignification
assign y = a & b;Piloter y avec le ET de a et b
assign sum = a + b;Calculer une somme en continu
assign y = sel ? a : b;Ternaire - un multiplexeur 2 vers 1
assign {c, s} = a + b;Capturer ensemble la retenue et la somme
assign y = ~en;Piloter un wire à partir d'un signal inversé

Blocs procéduraux

always et initial exécutent des instructions ; la liste de sensibilité contrôle le moment.

SyntaxeSignification
always @(*) begin ... endLogique combinatoire (tout changement d'entrée)
always @(posedge clk)S'exécute à chaque front montant d'horloge (séquentiel)
always @(negedge clk)S'exécute à chaque front descendant d'horloge
always @(posedge clk or posedge rst)Bloc cadencé avec reset asynchrone
initial begin ... endS'exécute une fois à l'instant 0 (testbenches, simulation uniquement)
begin ... endGrouper plusieurs instructions
#10Délai de 10 unités de temps (simulation uniquement)

Bloquant vs non bloquant

Utilisez = pour la logique combinatoire, <= pour la logique séquentielle cadencée.

SyntaxeSignification
a = b;Bloquant - s'exécute dans l'ordre, immédiatement
a <= b;Non bloquant - tous les RHS lus d'abord, puis affectés
always @(*) y = a & b;Combinatoire : utilisez le bloquant =
always @(posedge clk) q <= d;Une bascule : utilisez le non bloquant <=
Mélanger = et <= dans un même blocÀ éviter - source fréquente de bugs

Contrôle de flux

Conditions et branchements multivoies à l'intérieur des blocs procéduraux.

SyntaxeSignification
if (cond) ... else ...Instruction conditionnelle
if (a) x = 1; else x = 0;If/else sur une seule ligne
case (sel) ... endcaseBranchement multivoie sur une valeur
2'b00: y = a;Un élément de case
default: y = 0;Élément de case par défaut
for (i = 0; i < 8; i = i + 1)Boucle (souvent dans generate ou en simulation)
repeat (4) @(posedge clk);Répéter une instruction N fois

Motifs courants

Briques que vous écrivez encore et encore, plus des tâches de testbench.

MotifSyntaxe
Bascule Dalways @(posedge clk) q <= d;
Registre avec resetalways @(posedge clk) if (rst) q <= 0; else q <= d;
Compteuralways @(posedge clk) count <= count + 1;
Registre d'état d'une FSMalways @(posedge clk) state <= next_state;
Logique d'état suivant d'une FSMalways @(*) case (state) ... endcase
Afficher une valeur$display("q = %b", q);
Afficher au changement$monitor("t=%0t q=%b", $time, q);
Terminer la simulation$finish;

Chaque élément de syntaxe Verilog dont vous avez besoin, sur une seule page. Cet aide-mémoire Verilog est une référence rapide pour le langage de description de matériel - déclarer des modules et des ports, choisir les types de données, écrire de la logique combinatoire et séquentielle, et les motifs de blocs always qui décrivent de vrais circuits.

La syntaxe présentée ici est du Verilog standard (IEEE 1364) et fonctionne dans les simulateurs courants comme Icarus Verilog et Verilator. Copiez ce dont vous avez besoin, ou essayez-la en direct dans le playground Verilog - écrivez un module, simulez-le et voyez la sortie dans votre navigateur.

FAQ de l'aide-mémoire Verilog

Cet aide-mémoire Verilog est-il gratuit ?
Oui. Cet aide-mémoire Verilog est entièrement gratuit, sans inscription. Mettez-le en favori et revenez dès que vous devez retrouver une syntaxe, un opérateur ou un motif de bloc always.
Quelle est la différence entre wire et reg ?
Un wire modélise une connexion physique et doit être piloté en continu - par une instruction assign ou une sortie de module - vous l'utilisez donc pour les nets combinatoires. Un reg conserve sa valeur jusqu'à ce que du code procédural la change, vous l'utilisez donc pour tout ce qui est affecté dans un bloc always ou initial. Malgré son nom, un reg ne devient pas toujours un registre matériel ; cela signifie simplement que la valeur est définie de manière procédurale.
Quelle est la différence entre affectation bloquante et non bloquante ?
L'affectation bloquante (=) s'exécute immédiatement et dans l'ordre, comme une instruction de programmation normale, utilisez-la donc pour la logique combinatoire dans les blocs always @(*). L'affectation non bloquante (<=) évalue d'abord tous les membres de droite puis met à jour les membres de gauche ensemble, ce qui modélise correctement les bascules - utilisez-la donc dans les blocs cadencés always @(posedge clk). Mélanger les deux dans un même bloc est une source classique de bugs de simulation.
Puis-je m'entraîner à Verilog en ligne ?
Oui. Ouvrez le playground Verilog pour écrire un module, le simuler et voir la sortie dans votre navigateur - rien à installer. Quand vous voulez de la structure, le cours Verilog interactif gratuit de Coddy vous emmène des modules et des types de données jusqu'aux blocs always et aux machines à états finis, étape par étape.
Cet aide-mémoire convient-il aux débutants ?
Oui. Il est organisé des fondations (modules, ports et types de données) jusqu'à la logique séquentielle et aux motifs de FSM, pour que vous puissiez commencer par les premières sections et progresser vers la description de vrais circuits.
Coddy programming languages illustration

Apprenez Verilog avec Coddy

COMMENCER