Opérateurs Verilog : Arithmétiques et de contrôle essentiels pour la synthèse
Des données non traitées sont inutiles ; il y a toujours calcul dans circuits numériques et systèmes informatiques. Examinons les opérateurs Verilog permettant aux outils de synthèse de réaliser éléments matériels appropriés.
Opérateurs arithmétiques Verilog
Si second opérande division/modulo = 0, résultat = X. Si opérande puissance est real, résultat real. Résultat = 1 si second opérande puissance = 0 (a0).
| Opérateur | Description |
|---|---|
| a + b | a plus b |
| a - b | a moins b |
| a * b | a multiplié par b |
| a / b | a divisé par b |
| a % b | a modulo b |
| a ** b | a puissance b |
Exemple :
module des; reg [7:0] data1, data2; initial begin
data1 = 45; data2 = 9;
$display ("Add + = %d", data1 + data2);
$display ("Sub - = %d", data1 - data2);
$display ("Mul * = %d", data1 * data2);
$display ("Div / = %d", data1 / data2);
$display ("Mod %% = %d", data1 % data2);
$display ("Pow ** = %d", data2 ** 2);
end endmodule
Simulation Log :
ncsim> run Add + = 54 Sub - = 36 Mul * = 149 Div / = 5 Mod % = 0 Pow ** = 81 ncsim: *W,RNQUIE: Simulation is complete.
Opérateurs relationnels Verilog
Expression avec opérateur relationnel = 1 si vraie, 0 si fausse. Si opérande X ou Z, résultat = X. Priorité inférieure aux arithmétiques, même priorité entre eux.
| Opérateur | Description |
|---|---|
| a < b | a inférieur à b |
| a > b | a supérieur à b |
| a <= b | a inférieur ou égal à b |
| a >= b | a supérieur ou égal à b |
module des; reg [7:0] data1, data2; initial begin
data1 = 45; data2 = 9; $display ("data1 >= data2 : %0d", data1 >= data2);
data1 = 45; data2 = 45; $display ("data1 <= data2 : %0d", data1 <= data2);
data1 = 9; data2 = 8; $display ("data1 > data2 : %0d", data1 > data2);
data1 = 22; data2 = 22; $display ("data1 < data2 : %0d", data1 < data2);
end endmodule
Simulation Log :
ncsim> run Result for data1 >= data2 : 1 ... Result for data1 < data2 : 0 ncsim: *W,RNQUIE: Simulation is complete.
Opérateurs d'égalité Verilog
Même priorité entre eux, inférieure aux relationnels. Résultat 1 si vrai, 0 si faux. Si opérande de == ou != est X ou Z, résultat = X. Utilisez === (égalité de cas) ou !== (inégalité de cas) pour matcher X et Z, toujours valeur connue.
| Opérateur | Description |
|---|---|
| a === b | a égal à b, incluant x et z |
| a !== b | a non égal à b, incluant x et z |
| a == b | a égal à b, résultat peut être inconnu |
| a != b | a non égal à b, résultat peut être inconnu |
module des; reg [7:0] data1, data2; initial begin
data1 = 45; data2 = 9; $display ("data1 === data2 : %0d", data1 === data2);
data1 = 'b101x; data2 = 'b1011; $display ("data1 === data2 : %0d", data1 === data2);
data1 = 'b101x; data2 = 'b101x; $display ("data1 === data2 : %0d", data1 === data2);
data1 = 'b101z; data2 = 'b1z00; $display ("data1 !== data2 : %0d", data1 !== data2);
data1 = 39; data2 = 39; $display ("data1 == data2 : %0d", data1 == data2);
data1 = 14; data2 = 14; $display ("data1 != data2 : %0d", data1 != data2);
end endmodule
Simulation Log :
ncsim> run Result for data1(45) === data2(9) : 0 ... Result for data1(14) != data2(14) : 0 ncsim: *W,RNQUIE: Simulation is complete.
Opérateurs logiques Verilog
Résultat && = 1 si les deux opérandes vrais/non-zéro. || = 1 si l'un vrai/non-zéro. Si opérande X, résultat = X. Négation ! convertit non-zéro/vrai en 0, zéro/faux en 1, X reste X.
| Opérateur | Description |
|---|---|
| a && b | vrai si a et b vrais |
| a || b | vrai si a ou b vrais |
| !a | Convertit non-zéro en zéro, et vice versa |
module des; reg [7:0] data1, data2; initial begin
data1 = 45; data2 = 9; $display ("data1 && data2 : %0d", data1 && data2);
data1 = 0; data2 = 4; $display ("data1 && data2 : %0d", data1 && data2);
data1 = 'dx; data2 = 3; $display ("data1 && data2 : %0d", data1 && data2);
data1 = 'b101z; data2 = 5; $display ("data1 && data2 : %0d", data1 && data2);
data1 = 45; data2 = 9; $display ("data1 || data2 : %0d", data1 || data2);
data1 = 0; data2 = 4; $display ("data1 || data2 : %0d", data1 || data2);
data1 = 'dx; data2 = 3; $display ("data1 || data2 : %0d", data1 || data2);
data1 = 'b101z; data2 = 5; $display ("data1 || data2 : %0d", data1 || data2);
data1 = 4; $display ("!data1 : %0d", !data1);
data1 = 0; $display ("!data1 : %0d", !data1);
end endmodule
Simulation Log :
ncsim> run Result of data1(45) && data2(9) : 1 ... Result of !data1(0) : 1 ncsim: *W,RNQUIE: Simulation is complete.
Opérateurs bit à bit Verilog
Combine un bit d'un opérande avec bit correspondant de l'autre pour calculer un bit résultat.
| & | 0 | 1 | x | z |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | x | x |
| x | 0 | x | x | x |
| z | 0 | x | x | x |
| | | 0 | 1 | x | z |
|---|---|---|---|---|
| 0 | 0 | 1 | x | x |
| 1 | 1 | 1 | 1 | 1 |
| x | x | 1 | x | x |
| z | x | 1 | x | x |
module des; reg data1[4]; reg data2[4]; int i, j; initial begin
data1[0]=0; data2[0]=0; data1[1]=1; data2[1]=1; data1[2]='x; data2[2]='x; data1[3]='z; data2[3]='z;
for (i=0;i<4;i+=1) for (j=0;j<4;j+=1) $display ("data1(%0d) & data2(%0d) = %0d", data1[i], data2[j], data1[i] & data2[j]);
end endmodule
Simulation Log :
ncsim> run data1(0) & data2(0) = 0 ... data1(z) & data2(z) = x ncsim: *W,RNQUIE: Simulation is complete.
Opérateurs de décalage Verilog
Deux types :
- Décalage logique : << et >>
- Décalage arithmétique : <<< et >>>
module des; reg [7:0] data; int i; initial begin
data = 8'h1; $display ("Original data = 'd%0d or 'b%0b", data, data);
for (i=0;i<8;i+=1) $display ("data << %0d = 'b%b", i, data << i);
data = 8'h80; $display ("Original data = 'd%0d or 'b%0b", data, data);
for (i=0;i<8;i+=1) $display ("data >> %0d = 'b%b", i, data >> i);
data = 8'h1; $display (" data >> 1 = 'b%b", data >> 1);
end endmodule
Simulation Log :
ncsim> run Original data = 'd1 or 'b00000001 data << 0 = 'b00000001 ... data >> 1 = 'b00000000 ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Opérateurs C# — Guide complet des opérateurs en C#
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace