Funciones de Verilog
A menudo, encontramos que ciertos fragmentos de código son repetitivos y se llaman varias veces dentro del RTL. En su mayoría, no consumen tiempo de simulación y pueden implicar cálculos complejos que deben realizarse con diferentes valores de datos. En tales casos, podemos declarar un function
y coloque el código repetitivo dentro de la función y permita que devuelva el resultado. Esto reducirá drásticamente la cantidad de líneas en el RTL, ya que todo lo que necesita hacer ahora es hacer una llamada de función y pasar 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 utilizará en una expresión. Una definición de función siempre comienza con la palabra clave function
seguido del tipo de devolución, el nombre y una lista de puertos entre paréntesis. Verilog sabe que la definición de una función ha terminado cuando encuentra el endfunction
palabra clave. Tenga en cuenta que una función debe tener al menos una entrada declarada y el tipo de devolución será void
si la función no devuelve nada.
Sintaxis
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
La palabra clave automatic
hará que la función reentrante y los elementos declarados dentro de la tarea se asignan 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 simultáneamente por N procesos cuando se bifurca.
Declaraciones de funciones
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 de una función
La definición de la función creará implícitamente una variable interna con el mismo nombre que la función. Por lo tanto, es ilegal declarar otra variable con el mismo nombre dentro del alcance de la función. El valor devuelto se inicializa asignando el resultado de la función a la variable interna.
sum = a + b;
Llamar a una función
Una llamada de función es un operando con una expresión y tiene una sintaxis como la que 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 # , @ , esperar , pospuesto , negativo
- 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 que no bloqueen o
force-release
oassign-deassign
- Una función no puede tener disparadores
- Una función no puede tener salida ni entrada
Funciones recursivas
Las funciones que se llaman a sí mismas se llaman funciones recursivas. En el ejemplo que se muestra 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;
// This function is called within the body of this
// function with a different argument
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
Registro de simulación 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 populares en Stratasys Insight
- Funciones de C++ con ejemplos de programas
- Funciones Python Lambda con EJEMPLOS
- Tutorial de Verilog
- Concatenación Verilog
- Asignaciones de Verilog
- Bloqueo y no bloqueo de Verilog
- Funciones matemáticas de Verilog
- C - Funciones
- MATLAB - Funciones
- Python - Funciones