Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

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:

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
  • Variables (vector/escalar)
  • Selección de bit o parte de un vector reg, variable integer o time
  • Palabra de memoria
  • Concatenación de cualquiera de los anteriores
Continua
  • Red (vector/escalar)
  • Selección de bit o parte de un vector net
  • Concatenación de selecciones de bit y parte
Procesual continua
  • Red o variable (vector/escalar)
  • Selección de bit o parte de un vector net

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

  1. Dominar Verilog: Tutorial completo para diseño de circuitos digitales
  2. Dominar la concatenación en Verilog: Guía práctica
  3. Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
  4. Dominar las funciones en Verilog para diseño RTL eficiente
  5. Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
  6. Generador de reloj en Verilog: Guía de diseño e implementación
  7. Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
  8. Dominar $timeformat en Verilog: Control de precisión y visualización
  9. Comprender e imprimir timescales de Verilog en cualquier alcance
  10. Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar
  11. Guía para Principiantes de Verilog: Ejemplo Hola Mundo