Déclarations et types de données

Déclarations de signaux logiques

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;

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 :

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;

Le type integer

Le 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.

Valeurs logiques et entières

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 NN bits peut représenter un nombre entier compris entre 0 et 2N12^N-1. Un signal déclaré avec le mot-clé signed transporte une valeur comprise entre 2N1-2^{N-1} et 2N112^{N-1}-1, 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)

Constantes

Il existe deux manières de déclarer des constantes :

`define LEFT  30
`define RIGHT 75

wire [7:0] x
wire       ok

assign ok = x >= `LEFT && x <= `RIGHT;
localparam LEFT  = 30;
localparam RIGHT = 75;

wire [7:0] x
wire       ok

assign ok = x >= LEFT && x <= RIGHT;