Asignaciones de Verilog
La colocación de valores en redes y variables se denomina asignaciones. Hay tres formas básicas:
- Procedimiento
- Continuo
- Procedimiento continuo
Valores legales LHS
Una tarea tiene dos partes:lado derecho (RHS) y lado izquierdo (LHS) con un símbolo igual (=) o un símbolo menor que igual (<=) en el medio.
Tipo de tarea | Lado izquierdo |
---|---|
Procedimiento |
|
Continuo |
|
Procedimiento Continuo |
|
El RHS puede contener cualquier expresión que evalúe un valor final, mientras que el LHS indica una red o una variable a la que se asigna el valor en RHS.
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
Asignación procesal
Las asignaciones de procedimiento ocurren dentro de procedimientos como siempre, inicial, tarea y funciones y se utilizan para colocar valores en las variables. La variable mantendrá el valor hasta la siguiente asignación a la misma variable.
El valor se colocará en la variable cuando la simulación ejecute esta declaración en algún momento durante el tiempo de simulación. Esto se puede controlar y modificar de la manera que queramos mediante el uso de declaraciones de flujo de control como if-else-if, case y mecanismos de bucle.
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 de declaración de variables
Se puede colocar un valor inicial en una variable en el momento de su declaración, como se muestra a continuación. La asignación no tiene una duración y mantiene el valor hasta que ocurre la siguiente asignación a la misma variable. Tenga en cuenta que no se permiten las asignaciones de declaraciones de variables a una matriz.
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 se inicializa durante la declaración y en el tiempo 0 en un bloque inicial como se muestra a continuación, el orden de evaluación no está garantizado y, por lo tanto, puede tener 8'h05 o 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
Los bloques de procedimiento y las asignaciones 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!
Esto se usa para asignar valores a redes escalares y vectoriales y sucede cada vez que hay un cambio en el RHS. Proporciona una forma de modelar la lógica combinacional sin especificar una interconexión de puertas y facilita la conducción de la red con expresiones lógicas.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
Siempre que b o c cambie su valor, se evaluará toda la expresión en RHS y a se actualizará con el nuevo valor.
Asignación de declaración neta
Esto nos permite colocar una asignación continua en la misma declaración que declara la red. Tenga en cuenta que debido a que una red solo se puede declarar una vez, solo es posible una asignación de declaración para una red.
wire penable = 1;
Asignación continua procesal
Estas son declaraciones de procedimiento que permiten que las expresiones se asignen continuamente a redes o variables y son de dos tipos.
assign
...deassign
force
...release
asignar designar
Esto anulará todas las asignaciones de procedimiento 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 procesal o continua procesal. El LHS de un assign
La declaración no puede ser una selección de bits, una selección parcial o una referencia de matriz, pero puede ser una variable o una concatenación de variables.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
liberación forzada
Estos son similares al assign - deassign
pero también se puede aplicar a redes y variables. El LHS puede ser una selección de bits de una red, una selección parcial de una red, una variable o una red, pero no puede ser la referencia a una matriz y la selección de bits/partes de una variable. El force
declaración anulará todas las demás asignaciones realizadas a la variable hasta que se publique utilizando el release
palabra clave.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog