Types de données Verilog : Bits, fils et valeurs logiques expliqués
L'intention principale des types de données en Verilog est de représenter des éléments de stockage de données comme les bits dans une bascule et des éléments de transmission comme les fils connectant portes logiques et structures séquentielles.
Quelles valeurs les variables peuvent-elles contenir ?
Presque tous les types de données ne peuvent avoir que l'une des quatre valeurs ci-dessous, sauf real et event :
| 0 | représente un zéro logique, ou condition fausse |
| 1 | représente un un logique, ou condition vraie |
| x | représente une valeur logique inconnue (peut être 0 ou 1) |
| z | représente un état haute impédance |
L'image ci-dessous montre comment ces valeurs apparaissent dans les diagrammes de timing et formes d'onde de simulation. La plupart des simulateurs utilisent la convention : rouge pour X et orange au milieu pour haute impédance Z.

Que implique le système de valeurs Verilog ?
Verilog décrivant des éléments matériels comme bascules et logique combinatoire (NAND, NOR), il doit modéliser le système de valeurs du matériel. Un logique 1 représente la tension d'alimentation Vdd (0.8V à plus de 3V selon nœud technologique). Un logique 0 représente la masse (0V).
X ou x signifie valeur inconnue (0 ou 1), différent du "don't care" en logique booléenne.
Comme tout circuit électrique incomplet, un fil non connecté aura une haute impédance à ce nœud, représenté par Z ou z. En Verilog, tout fil non connecté résulte en haute impédance.
Nets (Réseaux) et Variables
Nets et variables sont les deux groupes principaux de types de données représentant différentes structures matérielles, différant par leur affectation et rétention de valeurs.
Nets
Les nets connectent des entités matérielles comme portes logiques et ne stockent pas de valeur. Dans l'image ci-dessous, un net net_11 connecte la sortie d'une porte AND à l'entrée d'une bascule data_0. Les deux entrées de la porte AND sont connectées aux nets net_45 et net_67.

Il existe différents types de nets, mais le plus populaire en conception numérique est wire. Un wire connecte des éléments et des nets pilotés par une seule porte ou affectation continue. Similaire au fil électrique sur une breadboard.

Pour plusieurs nets, on peut les regrouper en un seul wire. Un wire 4-bit peut envoyer 4 valeurs séparées. Ces entités de largeur >1 sont appelées vecteurs.
wire [3:0] n0; // wire 4-bit -> vecteur

Il est illégal de redéclarer un nom déjà déclaré par un net, paramètre ou variable :
module design;
wire abc; wire a; wire b; wire c; wire abc; // Erreur: "abc" déjà déclaré
assign abc = a & b | c;
endmodule
Variables

Une variable abstrait un élément de stockage de données et peut retenir des valeurs. Une bascule est un bon exemple. Le type reg modélise des registres matériels car il retient des valeurs entre affectations. Notez qu'un reg ne représente pas toujours une bascule ; il peut aussi représenter de la logique combinatoire.

Autres types de données
integer
Variable à usage général de 32 bits pour modéliser du matériel et stocker des valeurs entières.
integer count; // Count est une valeur entière > 0
time
Variable non signée, 64 bits, pour stocker des quantités de temps de simulation pour le débogage. realtime stocke le temps comme quantité flottante.
time end_time; // end_time = 50ns
realtime rtime; // rtime = 40.25ps
real
Variable stockant des valeurs à virgule flottante, assignable comme integer et reg.
real float; // float = 12.344
Exemple
module testbench;
integer int_a;
real real_b;
time time_c;
initial begin
int_a = 32'hcafe_1234;
real_b = 0.1234567;
#20;
time_c = $time;
$display ("int_a = 0x%0h", int_a);
$display ("real_b = %0.5f", real_b);
$display ("time_c = %0t", time_c);
end
endmodule
Simulation Log :
ncsim> run int_a = 0xcafe1234 real_b = 0.12346 time_c = 20 ncsim: *W,RNQUIE: Simulation is complete.
Chaînes Verilog
Les chaînes sont stockées dans reg, la largeur doit être suffisante. Chaque caractère = 1 octet (ASCII). Si variable trop petite, troncature des bits de poids fort. Si plus grande, padding de zéros à gauche.
// "Hello World" requiert 11 octets
reg [8*11:1] str = "Hello World"; // str = "Hello World"
reg [8*5:1] str = "Hello World"; // str = "World" (tronqué)
reg [8*20:1] str = "Hello World"; // str = " Hello World" (padding)
Exemple complet :
module testbench;
reg [8*11:1] str1;
reg [8*5:1] str2;
reg [8*20:1] str3;
initial begin
str1 = "Hello World";
str2 = "Hello World";
str3 = "Hello World";
$display ("str1 = %s", str1);
$display ("str2 = %s", str2);
$display ("str3 = %s", str3);
end
endmodule
Simulation Log :
ncsim> run str1 = Hello World str2 = World str3 = Hello World ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Maîtriser les variables C# et types de données primitifs : guide complet
- Comprendre les types de données C++ : Fondamentaux, modificateurs et bonnes pratiques
- Types de données en C expliqués : int, float, char et plus — Guide complet
- Maîtriser les types de données Python : Guide pratique
- Types de données primitifs en Java : Guide complet avec exemples
- 5 Modèles de Centres de Données Expliqués : Conception, Cas d'Usage et Exemples
- Huit Modèles Clés de Cloud Computing en 2021
- 8 types courants de violations de données – Exemples réels et impact
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques