Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
La colocación de valores en redes (nets) y variables se denomina asignaciones. Existen tres formas básicas:
- Procesuales
- Continuas
- Procesuales continuas
Valores LHS válidos
Una asignación tiene dos partes: lado derecho (RHS) y lado izquierdo (LHS) con un símbolo de igualdad (=) o menor-igual (<=) entre ellos.
| Tipo de asignación | Lado izquierdo (LHS) |
|---|---|
| Procesual |
|
| Continua |
|
| Procesual continua |
|
El RHS puede contener cualquier expresión que se evalúe a un valor final, mientras que el LHS indica una red o variable a la que se asigna el valor del RHS.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk está en LHS y la negación de clk forma RHS
always #10 clk = ~clk;
// y es LHS y la constante 1 es RHS
assign y = 1;
// f es LHS, y la expresión de a,b,d,e forma RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z es LHS, y la expresión de a,b,c,d forma RHS
z <= a + b + c + d;
end
initial begin
// Nombres de variables a la izquierda forman LHS mientras 0 es RHS
a <= 0;
b <= 0;
c <= 0;
d <= 0;
e <= 0;
clk <= 0;
end
endmodule
Asignación procesual
Las asignaciones procesuales ocurren dentro de procedimientos como always, initial, task y function, y se usan para colocar valores en variables. La variable retendrá el valor hasta la siguiente asignación a la misma variable.
El valor se coloca en la variable cuando la simulación ejecuta esta declaración en algún momento durante el tiempo de simulación. Esto puede controlarse y modificarse mediante declaraciones de control de flujo como if-else-if, case y mecanismos de bucles.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
Asignación en declaración de variable
Un valor inicial puede colocarse en una variable en el momento de su declaración como se muestra a continuación. La asignación no tiene duración y mantiene el valor hasta la siguiente asignación a la misma variable. Tenga en cuenta que las asignaciones en declaración de variables a un array no están permitidas.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678;
// data tendrá dead_cafe desde tiempo 0 hasta tiempo 20
// En tiempo 20, data obtendrá 12345678
end
endmodule
reg [3:0] a = 4'b4;
// es equivalente a
reg [3:0] a;
initial a = 4'b4;
Si la variable se inicializa durante la declaración y en el tiempo 0 en un bloque initial como se muestra a continuación, el orden de evaluación no está garantizado, y por tanto puede tener 8'h05 u 8'hee.
module my_block;
reg [7:0] addr = 8'h05;
initial addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // ilegal
integer i = 0, j; // declara dos enteros i,j y i se asigna 0
real r2 = 4.5, r3 = 8; // declara dos reales r2,r3 y se asignan 4.5, 8 resp.
time startTime = 40; // declara variable time con valor inicial 40
Los bloques y asignaciones procesuales se tratarán con más detalle en una sección posterior.
Asignación continua
¡Haga clic aquí para ver un ejemplo de simulación paso a paso!
Se utiliza para asignar valores a redes escalares y vectoriales y ocurre cada vez que hay un cambio en el RHS. Proporciona una forma de modelar lógica combinacional sin especificar una interconexión de puertas y facilita el control de la red con expresiones lógicas.
// Modelo de ejemplo de una puerta AND
wire a, b, c;
assign a = b & c;
Cada vez que b o c cambian su valor, toda la expresión en RHS se evalúa y a se actualiza con el nuevo valor.
Asignación en declaración de red
Esto permite colocar una asignación continua en la misma declaración que declara la red. Tenga en cuenta que, como una red solo puede declararse una vez, solo es posible una asignación de declaración por red.
wire penable = 1;
Asignación procesual continua
Son declaraciones procesuales que permiten que expresiones se asignen continuamente a redes o variables y son de dos tipos:
assign...deassignforce...release
assign deassign
Esto anulará todas las asignaciones procesuales a una variable y se desactiva usando la misma señal con deassign. El valor de la variable permanecerá igual hasta que la variable obtenga un nuevo valor a través de una asignación procesual o procesual continua. El LHS de una declaración assign no puede ser una selección de bit, parte o referencia a array, pero puede ser una variable o concatenación de variables.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
force release
Son similares a las declaraciones assign - deassign pero también pueden aplicarse a redes y variables. El LHS puede ser una selección de bit de una red, parte de una red, variable o red, pero no puede ser la referencia a un array y selección de bit/parte de una variable. La declaración force anulará todas las demás asignaciones hechas a la variable hasta que se libere usando la palabra clave release.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar
- Guía para Principiantes de Verilog: Ejemplo Hola Mundo