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