Affectations Verilog
Placer des valeurs sur des réseaux et des variables s'appelle des affectations. Il existe trois formes de base :
- Procédure
- Continu
- Procédure continue
Valeurs LHS légales
Une affectation comporte deux parties :le côté droit (RHS) et le côté gauche (LHS) avec un symbole égal (=) ou un symbole inférieur à égal (<=) entre les deux.
Type d'affectation | Côté gauche |
---|---|
Procédural |
|
Continu |
|
Procédural continu |
|
Le RHS peut contenir n'importe quelle expression qui donne une valeur finale tandis que le LHS indique un réseau ou une variable à laquelle la valeur dans RHS est assignée.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk is on the LHS and the not of clk forms RHS
always #10 clk = ~clk;
// y is the LHS and the constant 1 is RHS
assign y = 1;
// f is the LHS, and the expression of a,b,d,e forms the RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z is the LHS, and the expression of a,b,c,d forms the RHS
z <= a + b + c + d;
end
initial begin
// Variable names on the left form LHS while 0 is RHS
a <= 0; b <= 0; c <= 0; d <= 0; e <= 0;
clk <= 0;
end
endmodule
Affectation procédurale
Les affectations procédurales se produisent dans des procédures telles que toujours, initiale, tâche et fonctions et sont utilisées pour placer des valeurs sur des variables. La variable conservera la valeur jusqu'à la prochaine affectation à la même variable.
La valeur sera placée sur la variable lorsque la simulation exécute cette instruction à un moment donné pendant la durée de la simulation. Cela peut être contrôlé et modifié comme nous le souhaitons par l'utilisation d'instructions de flux de contrôle telles que if-else-if, l'instruction case et les mécanismes de boucle.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
Affectation de déclaration de variable
Une valeur initiale peut être placée sur une variable au moment de sa déclaration, comme illustré ci-dessous. L'affectation n'a pas de durée et conserve la valeur jusqu'à la prochaine affectation à la même variable. Notez que les affectations de déclaration de variable à un tableau ne sont pas autorisées.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678; // data will have dead_cafe from time 0 to time 20
// At time 20, data will get 12345678
end
endmodule
reg [3:0] a = 4'b4;
// is equivalent to
reg [3:0] a;
initial a = 4'b4;
Si la variable est initialisée lors de la déclaration et à l'instant 0 dans un bloc initial comme indiqué ci-dessous, l'ordre d'évaluation n'est pas garanti et peut donc avoir soit 8'h05 soit 8'hee.
module my_block;
reg [7:0] addr = 8'h05;
initial
addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegal
integer i = 0, j; // declares two integers i,j and i is assigned 0
real r2 = 4.5, r3 = 8; // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40; // declares time variable with initial value 40
Les blocs procéduraux et les devoirs seront traités plus en détail dans une section ultérieure.
Affectation continue
Cliquez ici pour un exemple de simulation étape par étape !
Ceci est utilisé pour attribuer des valeurs aux réseaux scalaires et vectoriels et se produit chaque fois qu'il y a un changement dans le RHS. Il fournit un moyen de modéliser la logique combinatoire sans spécifier une interconnexion de portes et facilite la conduite du réseau avec des expressions logiques.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
Chaque fois que b ou c change sa valeur, alors l'expression entière dans RHS sera évaluée et a sera mis à jour avec la nouvelle valeur.
Affectation de la déclaration nette
Cela nous permet de placer une affectation continue sur la même instruction qui déclare le net. Notez qu'étant donné qu'un réseau ne peut être déclaré qu'une seule fois, une seule affectation de déclaration est possible pour un réseau.
wire penable = 1;
Affectation continue procédurale
Ce sont des instructions procédurales qui permettent d'affecter en continu des expressions à des réseaux ou à des variables et sont de deux types.
assign
...deassign
force
...release
attribuer désattribuer
Cela remplacera toutes les affectations procédurales à une variable et est désactivé en utilisant le même signal avec deassign
. La valeur de la variable restera la même jusqu'à ce que la variable obtienne une nouvelle valeur via une affectation continue procédurale ou procédurale. Le LHS d'un assign
L'instruction ne peut pas être une sélection de bits, une sélection de partie ou une référence de tableau, mais peut être une variable ou une concaténation de variables.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
libération forcée
Ceux-ci sont similaires au assign - deassign
déclarations mais peuvent également être appliquées aux réseaux et aux variables. Le LHS peut être une sélection de bits d'un réseau, une sélection de partie d'un réseau, une variable ou un réseau, mais ne peut pas être la référence à un tableau et une sélection de bits/parties d'une variable. Le force
l'instruction remplacera toutes les autres affectations faites à la variable jusqu'à ce qu'elle soit publiée à l'aide du release
mot-clé.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog