Dominar el flujo de control en Verilog: IF-ELSE, Case y más
El comportamiento del hardware no puede implementarse sin declaraciones condicionales y otras formas de controlar el flujo de lógica. Verilog tiene un conjunto de bloques y mecanismos de flujo de control para lograrlo.
if-else-if
Esta declaración condicional se usa para decidir si ciertas declaraciones deben ejecutarse o no. Es muy similar a las declaraciones if-else-if en C. Si la expresión se evalúa como verdadera, se ejecutará la primera declaración. Si la expresión se evalúa como falsa y existe una parte else, se ejecutará la parte else.
// if statement sin parte else
if (expresión) [declaración]
// if statement con parte else
if (expresión) [declaración] else [declaración]
// if else para múltiples declaraciones debe
// encerrarse dentro de "begin" y "end"
if (expresión) begin
[múltiples declaraciones]
end else begin
[múltiples declaraciones]
end
// declaración if-else-if
if (expresión) [declaración]
else if (expresión) [declaración]
else [declaración]
La parte else de un if-else es opcional y puede causar confusión si se omite un else en una secuencia if anidada. Para evitar esta confusión, es más fácil asociar siempre el else al if anterior que carece de else. Otra forma es encerrar las declaraciones dentro de un bloque begin-end. La última parte else maneja el caso none-of-the-above o default donde ninguna de las otras condiciones se satisfizo.
Haga clic aquí para leer más sobre if-else-if
Los bucles proporcionan una forma de ejecutar declaraciones simples o múltiples dentro de un bloque una o más veces. Hay cuatro tipos diferentes de declaraciones de bucle en Verilog.
Bucle forever
Ejecutará continuamente las declaraciones dentro del bloque.
forever [declaración]
forever begin
[múltiples declaraciones]
end
Ejemplo
module my_design;
initial begin
forever begin
$display ("Esto se imprimirá para siempre, la simulación puede colgarse ...");
end
end
endmodule
ncsim> run This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... ... ... This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... Result reached the maximum of 5000 lines. Killing process.
Bucle repeat
Ejecutará declaraciones un número fijo de veces. Si la expresión se evalúa a X o Z, se tratará como cero y no se ejecutará en absoluto.
repeat ([núm_de_veces]) begin
[declaraciones]
end
repeat ([núm_de_veces]) @ ([algún_evento]) begin
[declaraciones]
end
Ejemplo
module my_design;
initial begin
repeat(4) begin
$display("Esta es una nueva iteración ...");
end
end
endmodule
ncsim> run This is a new iteration ... This is a new iteration ... This is a new iteration ... This is a new iteration ... ncsim: *W,RNQUIE: Simulation is complete.
Bucle while
Ejecutará declaraciones mientras una expresión sea verdadera y saldrá una vez que la condición se vuelva falsa. Si la condición es falsa desde el principio, las declaraciones no se ejecutarán en absoluto.
while (expresión) begin
[declaraciones]
end
Ejemplo
module my_design;
integer i = 5;
initial begin
while (i > 0) begin
$display ("Iteración#%0d", i);
i = i - 1;
end
end
endmodule
ncsim> run Iteration#5 Iteration#4 Iteration#3 Iteration#2 Iteration#1 ncsim: *W,RNQUIE: Simulation is complete.
Bucle for
for (asignación_inicial; condición; incremento_variable) begin
[declaraciones]
end
Controlará las declaraciones usando un proceso de tres pasos:
- Inicializar una variable contador de bucle
- Evaluar la expresión, generalmente involucrando la variable contador de bucle
- Incrementar la variable contador de bucle para que en un momento posterior la expresión se vuelva falsa y el bucle salga.
Ejemplo
module my_design;
integer i = 5;
initial begin
for (i = 0; i < 5; i = i + 1) begin
$display ("Bucle #%0d", i);
end
end
endmodule
ncsim> run Loop #0 Loop #1 Loop #2 Loop #3 Loop #4 ncsim: *W,RNQUIE: Simulation is complete.
Haga clic aquí para leer más sobre bucles for.
Verilog
- Expresiones, sentencias y bloques en C#: Guía completa con ejemplos prácticos
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar el flujo de control en Verilog: IF-ELSE, Case y más
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Comprender el control de retraso en Verilog: Técnicas de temporización y mejores prácticas
- Generador de reloj en Verilog: Guía de diseño e implementación
- Entender Expresiones, Sentencias y Bloques en Java