Dominar las funciones en Verilog para diseño RTL eficiente
A menudo encontramos ciertas piezas de código que son repetitivas y se llaman múltiples veces dentro del RTL. Generalmente no consumen tiempo de simulación y pueden involucrar cálculos complejos que deben realizarse con diferentes valores de datos. En tales casos, podemos declarar una function y colocar el código repetitivo dentro de la función permitiéndole devolver el resultado. Esto reducirá drásticamente la cantidad de líneas en el RTL ya que todo lo que necesita hacer ahora es una llamada a función y pasar los datos sobre los que se debe realizar el cálculo. De hecho, esto es muy similar a las funciones en C.
El propósito de una función es devolver un valor que se usará en una expresión. Una definición de función siempre comienza con la palabra clave function seguida por el tipo de retorno, nombre y una lista de puertos entre paréntesis. Verilog sabe que una definición de función ha terminado cuando encuentra la palabra clave endfunction. Tenga en cuenta que una función debe tener al menos una entrada declarada y el tipo de retorno será void si la función no devuelve nada.
Sintaxis
function [automatic] [tipo_retorno] nombre ([lista_puertos]);
[declaraciones]
endfunction
La palabra clave automatic hará que la función sea reentrante y los elementos declarados dentro de la tarea se asignarán dinámicamente en lugar de compartirse entre diferentes invocaciones de la tarea. Esto será útil para funciones recursivas y cuando la misma función se ejecuta concurrentemente por N procesos cuando se bifurcan.
Declaraciones de función
Hay dos formas de declarar entradas a una función:
function [7:0] sum;
input [7:0] a, b;
begin
sum = a + b;
end
endfunction
function [7:0] sum (input [7:0] a, b);
begin
sum = a + b;
end
endfunction
Devolver un valor desde una función
La definición de función creará implícitamente una variable interna con el mismo nombre que la función. Por lo tanto, es ilegal declarar otra variable del mismo nombre dentro del ámbito de la función. El valor de retorno se inicializa asignando el resultado de la función a la variable interna.
sum = a + b;
Llamar a una función
Una llamada a función es un operando con una expresión y tiene una sintaxis como se muestra a continuación.
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
Reglas de funciones
- Una función no puede contener declaraciones controladas por tiempo como #, @, wait, posedge, negedge
- Una función no puede iniciar una tarea porque puede consumir tiempo de simulación, pero puede llamar a otras funciones
- Una función debe tener al menos una entrada
- Una función no puede tener asignaciones no bloqueantes o
force-releaseoassign-deassign - Una función no puede tener disparadores (triggers)
- Una función no puede tener salidas (output) o inout
Funciones recursivas
Las funciones que se llaman a sí mismas se llaman funciones recursivas. En el ejemplo mostrado a continuación, se escribe una función recursiva para calcular el factorial de un número dado.
module tb;
initial begin
integer result = factorial(4);
$display("factorial(4) = %0d", result);
end
function automatic integer factorial(integer i);
integer result = i;
// Esta función se llama dentro del cuerpo de esta
// función con un argumento diferente
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
xcelium> run i=1 result=1 i=2 result=2 i=3 result=6 i=4 result=24 factorial(4) = 24 xmsim: *W,RNQUIE: Simulation is complete
Verilog
- 10 funciones esenciales de Insight para optimizar la impresión FDM de Stratasys
- Funciones en C++ Explicadas con Ejemplos de Código Prácticos
- Dominando funciones en C: Estructura, declaración y mejores prácticas
- 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 las funciones matemáticas en Verilog para diseño de hardware eficiente
- Funciones en MATLAB: Definición, Workspace, Entradas y Salidas
- Dominando las funciones lambda en Python: ejemplos prácticos y mejores prácticas
- Funciones en Python explicadas: Construyendo módulos de código reutilizable