Types de données Verilog
L'intention principale des types de données dans le langage Verilog est de représenter des éléments de stockage de données comme des bits dans une bascule et des éléments de transmission comme des fils qui se connectent entre des portes logiques et des structures séquentielles.
Quelles sont les valeurs des variables ?
Presque tous les types de données ne peuvent avoir qu'une des quatre valeurs différentes indiquées ci-dessous, à l'exception de real
et event
types de données.
0 | représente un zéro logique ou une condition fausse |
1 | représente un un logique ou une condition vraie |
x | représente une valeur logique inconnue (peut être zéro ou un) |
z | représente un état à haute impédance |
L'image suivante montre comment ces valeurs sont représentées dans les chronogrammes et les signaux de simulation. La plupart des simulateurs utilisent cette convention où rouge signifie X
et orange au milieu signifie haute impédance ou Z
.
Qu'implique l'ensemble de valeurs verilog ?
Puisque Verilog est essentiellement utilisé pour décrire des éléments matériels comme les bascules et la logique combinatoire comme NAND et NOR, il doit modéliser le système de valeur trouvé dans le matériel. Un un logique représenterait la tension d'alimentation Vdd qui peut varier entre 0,8 V et plus de 3 V en fonction du nœud de technologie de fabrication. Un zéro logique représenterait la masse et donc une valeur de 0V.
X
ou x
signifie que la valeur est simplement inconnue à ce moment-là et peut être 0 ou 1. C'est assez différent de la façon dont X
est traité en logique booléenne, où il signifie "ne s'en soucie pas".
Comme pour tout circuit électrique incomplet, le fil qui n'est connecté à rien aura une haute impédance à ce nœud et est représenté par Z
ou z
. Même dans verilog, tout fil non connecté entraînera une haute impédance.
Réseaux et variables
Filets et variables sont les deux principaux groupes de types de données qui représentent différentes structures matérielles et diffèrent dans la manière dont ils sont attribués et conservent des valeurs.
Filets
Filets sont utilisés pour se connecter entre des entités matérielles telles que des portes logiques et ne stockent donc aucune valeur par eux-mêmes. Dans l'image ci-dessous, un réseau appelé net_11 est utilisé pour se connecter entre la sortie de la porte ET et la première entrée de la bascule appelée data_0. De la même manière, les deux entrées de la porte ET sont connectées aux réseaux net_45 et net_67.
Il existe différents types de filets, chacun avec des caractéristiques différentes, mais le filet le plus populaire et le plus largement utilisé dans les conceptions numériques est de type wire
. Un wire
est un type de données Verilog utilisé pour connecter des éléments et pour connecter des réseaux pilotés par une seule porte ou une affectation continue. Le wire
est similaire au fil électrique utilisé pour connecter deux composants sur une planche à pain.
Lorsqu'il y a un besoin pour plusieurs filets, ils peuvent être regroupés pour former un seul wire
. Dans l'image ci-dessous, nous avons un fil 4 bits qui peut envoyer 4 valeurs distinctes sur chacun des fils. De telles entités avec une largeur supérieure à 1 sont appelées vecteurs comme nous le verrons dans le prochain article.
wire [3:0] n0; // 4-bit wire -> this is a vector
Il est illégal de redéclarer un nom déjà déclaré par un net, un paramètre ou une variable comme indiqué dans le code ci-dessous.
module design;
wire abc;
wire a;
wire b;
wire c;
wire abc; // Error: Identifier "abc" previously declared
assign abc = a & b | c;
endmodule
Variables
Une variable, quant à elle, est une abstraction d'un élément de stockage de données et peut contenir des valeurs. Une bascule est un bon exemple d'élément de stockage.
Type de données Verilog reg
peut être utilisé pour modéliser des registres matériels car il peut contenir des valeurs entre les affectations. Notez qu'un reg
n'a pas toujours besoin de représenter une bascule car elle peut également être utilisée pour représenter la logique combinatoire.
Dans l'image de gauche, nous avons une bascule qui peut stocker 1 bit et la bascule de droite peut stocker 4 bits.
Autres types de données
entier
Un integer
est une variable à usage général de 32 bits de large qui peut être utilisée à d'autres fins lors de la modélisation du matériel et stocke des valeurs entières.
integer count; // Count is an integer value > 0
heure
Un time
La variable est non signée, large de 64 bits et peut être utilisée pour stocker des quantités de temps de simulation à des fins de débogage. Un realtime
variable stocke simplement le temps sous forme de quantité à virgule flottante.
time end_time; // end_time can be stored a time value like 50ns
realtime rtime; // rtime = 40.25ps
réel
Un real
variable peut stocker des valeurs à virgule flottante et peut être affectée de la même manière que integer
et reg
.
real float; // float = 12.344 - can store floating numbers
Exemple
module testbench;
integer int_a; // Integer variable
real real_b; // Real variable
time time_c; // Time variable
initial begin
int_a = 32'hcafe_1234; // Assign an integer value
real_b = 0.1234567; // Assign a floating point value
#20; // Advance simulation time by 20 units
time_c = $time; // Assign current simulation time
// Now print all variables using $display system task
$display ("int_a = 0x%0h", int_a);
$display ("real_b = %0.5f", real_b);
$display ("time_c = %0t", time_c);
end
endmodule
Journal de simulation 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
, et la largeur du reg
La variable doit être suffisamment grande pour contenir la chaîne. Chaque caractère d'une chaîne représente une valeur ASCII et nécessite 1 octet. Si la taille de la variable est inférieure à la chaîne, Verilog tronque les bits les plus à gauche de la chaîne. Si la taille de la variable est supérieure à la chaîne, Verilog ajoute des zéros à gauche de la chaîne.
// "Hello World" requires 11 bytes
reg [8*11:1] str = "Hello World"; // Variable can store 11 bytes, str = "Hello World"
reg [8*5:1] str = "Hello World"; // Variable stores only 5 bytes (rest is truncated), str = "World"
reg [8*20:1] str = "Hello World"; // Variable can store 20 bytes (rest is padded with zeros), str = " Hello World"
Voici un exemple complet montrant comment les trois variables indiquées ci-dessus peuvent être simulées.
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
Notez que str1 a la bonne taille pour stocker les 11 octets de la chaîne "Hello World" et donc toute la chaîne est imprimée. Cependant, str2 ne peut stocker que 5 octets et, par conséquent, les 6 octets supérieurs sont tronqués et finissent par ne stocker que "World". La troisième variable str3 est supérieure à 11 octets et remplit les espaces vides à gauche et donc la valeur qui y est stockée devient " Hello World".
Journal de simulationncsim> run str1 = Hello World str2 = World str3 = Hello World ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Variables C# et types de données (primitifs)
- Types de données C++
- Types de données C
- Types de données Python
- Types de données Java (primitifs)
- 5 types de centres de données différents [avec exemples]
- 8 types de cloud computing différents en 2021
- 8 types de violations de données différents avec exemples
- Tutoriel Verilog