Dans la plupart des cas, les signaux logiques sont introduits par les mots-clés
wire et reg.
Il existe d’autres types de signaux qui ne seront pas présentés ici.
wire a;
wire [7:0] b;
reg c;
reg [7:0] d;
wire déclare un signal affecté par une instruction d’affectation concurrente
(instruction assign) ou connecté à la sortie d’une instance de module,reg déclare un signal affecté dans un processus (instruction always)
ou dans une instruction d’initialisation (instruction initial).Dans la terminologie du langage Verilog, les signaux déclarés avec le mot-clé
wire sont appelés des nets et ceux déclarés avec reg sont appelés des variables.
Ce vocabulaire peut prêter à confusion :
reg, bien qu’ils ne correspondent pas à des registres.Par défaut, un signal transporte une valeur sur un bit :
wire a;
reg c;
Un vecteur est déclaré en indiquant un intervalle d’indices entre crochets :
wire [7:0] b;
reg [7:0] d;
integerLe mot-clé integer est similaire à reg, mais il déclare toujours
une variable entière signée sur 32 bits.
On l’utilise souvent pour déclarer des variables locales à un processus,
comme par exemple les compteurs de boucles.
Comme les signaux de type reg, les variables de type integer doivent être
affectées dans des instructions always ou initial.
Un bit peut prendre l’une des quatre valeurs suivantes :
| Valeur | Signification |
|---|---|
0 |
La valeur 0, ou faux |
1 |
La valeur 1, ou vrai |
x |
Une valeur indéterminée |
z |
L’état haute impédance |
Contrairement à VHDL, Verilog ne fait pas de distinction entre les types logiques, entiers et booléens.
Dans l’exemple ci-dessous, les entiers 25 et 15 sont considérés comme des vecteurs.
Le signal a vaut 1 car la condition c > 15 est vraie :
wire a;
wire [7:0] c;
assign c = 25;
assign a = c > 15;
Par défaut, un vecteur de bits peut représenter un nombre entier compris
entre 0 et .
Un signal déclaré avec le mot-clé signed transporte une valeur comprise entre
et , codée en complément à deux :
wire [7:0] u; // 0 à 255
wire signed [7:0] s; // -128 à 127
Les valeurs littérales entières sont composées de quatre champs. Lorsque l’un des champs est absent, c’est sa valeur par défaut qui est utilisée :
| Champ | Valeurs possibles | Signification |
|---|---|---|
| Signe | + (par défaut) - |
Positif Négatif |
| Taille | Un entier (32 par défaut) | Le nombre de bits de la valeur |
| Base | 'd ou 'D (par défaut) 'h ou 'H 'b ou 'B 'o ou 'O |
Décimal Hexadécimal Binaire Octal |
| Valeur | Une séquence de digits incluant des chiffres, les lettres a à f, les lettres x et z |
La valeur du nombre ou du vecteur |
En Verilog 2001, le champ Base peut également imposer que le nombre soit signé
(indépendamment de la présence d’un signe + ou -).
On utilisera la syntaxe : 'sd, 'sh, 'sb, 'so (en minuscules ou en majuscules).
Exemples :
| Littéral | Valeur |
|---|---|
75, 'd75, 32'd75 |
L’entier 75 codé sur 32 bits (000…01001011) |
-75, -'d75, -32'd75 |
L’entier -75 codé sur 32 bits (111…10110101) |
8'd75, 8'h4B, 8'b01001011 |
L’entier 75 codé sur 8 bits (01001011) |
-8'd75, 8'shB5, 8'sb10110101 |
L’entier -75 codé sur 8 bits (10110101) |
Il existe deux manières de déclarer des constantes :
`define, similaire au #define du langage C.
Il faut alors précéder le nom de la constante avec le caractère `
lorsqu’elle est utilisée.`define LEFT 30
`define RIGHT 75
wire [7:0] x
wire ok
assign ok = x >= `LEFT && x <= `RIGHT;
localparam, disponible depuis Verilog 2001, qui déclare
un paramètre, comme le mot-clé parameter, mais sans offrir la possibilité
de changer sa valeur à l’instantiation du module.localparam LEFT = 30;
localparam RIGHT = 75;
wire [7:0] x
wire ok
assign ok = x >= LEFT && x <= RIGHT;