Programación en Verilog/Funciones y Tareas
Funciones
editarUna función es similar a una rutina en cualquier otro lenguaje de programación, donde se tiene argumentos de entrada y puede retornar un valor , pero en Verilog hay varias restricciones.
- No se puede invocar a otra tarea, pero si función.
- No puede contener control de tiempo.
- Sólo puede contener una salida.
- Sólo se pueden utilizar para modelar lógica combinacional.
La definición de una función debe estar incluida en el módulo de un diseño. La sintaxis de las funciones es la siguiente, donde rango es el tamaño del valor de retorno.
function <rango> <nombre>; <argumentos> <declaraciones> <funcionalidad> endfunction
Un ejemplo de función podría ser el siguiente.
module func;
function [7:0] add;
input [7:0] a, b;
reg [7:0] res;
begin
res = a + b;
add = res;
end
endfunction
reg [7:0] A;
initial
begin
A = add(8'b1010, 8'b1);
end
endmodule
// resultado A: 8'b1011
Tarea
editarUna tarea puede tener argumentos, pero no retorna ningún valor, que es distinto que varios de sus argumentos sean de salida. Su finalidad es reducir el código del diseño y sus llamadas se realizan en tiempo de compilación. Las características de las tareas se recogen a continuación.
- Se define en el módulo en el que se utilizan o pueden estar definidas en un fichero aparte y ser incluidas mediante la palabra reservada include.
- Puede invocar a otras funciones o tareas.
- Puede contener control de tiempo (#delay, posedge, negedge).
- Puede tener cualquier número de entradas y/o salidas, estas marcan el orden en que éstas deben pasarse a la tarea.
- Las variables declaradas son locales a dicha tarea.
- Las tareas pueden usar y/o asignar valores a cualquier señal declarada como global.
- Pueden utilizarse para modelar lógica combinacional o secuencial.
- La llamada a una tarea no se puede realizar dentro de una expresión.
La sintaxis de las tareas es la siguiente.
task <nombre>; <argumentos> <declaraciones> <funcionalidad> endtask
Un ejemplo de tarea es la siguiente.
module tsk;
reg ack;
reg [7:0] data,
task send;
input [7:0] a;
begin
data = a;
#5 S = 1;
wait(ack != 0);
#5 S = 0;
end
endtask
initial
begin
#5 send(100);
end
endmodule
Funciones del sistema
editarVerilog ofrece una serie de funciones específicas, las cuales no son sintetizables y su uso esta enfocado a la construcción de testbenches. Cada función en Verilog comienza con el carácter $ y deben estar declaradas dentro de un bloque. A continuación se muestran algunas de las funciones más comunes.
$time
editarDevuelve el tiempo actual de la simulación
A = $time;
$display
editarImprime por pantalla un mensaje cuando es ejecutado. Se puede añadir una lista de variables. El mensaje debe ser declarado entre comillas, seguido de la lista de variables a imprimir y su formato. Al final del mensaje se introduce un retorno de carro.
Formatos:
%b: binario %h: hexadecimal %c: carácter %o: octal %d: decimal %s: cadena de caracteres
Caracteres de escape:
\n: Retorno de línea \\: Carácter \ \t: Tabulador %%: Carácter %
$display("Valor variable A %d, Valor variable B %d", A, B);
$monitor
editarEsta función tiene la misma sintaxis que $display, es decir se saca por pantalla un mensaje siempre que una de las variables que se imprime cambie.
$monitor("Valor variable A %d, Valor variable B %d", A, B);
// Cuando A o B cambien su valor se imprimirá el mensaje
$monitoroff
editarEsta función detiene la monitorización de variables que ejecuta la función $monitor.
$monitoroff;
$monitoron
editarEsta función habilita la monitorización de variables que ejecuta la función $monitoroff.
$monitoron;
$fopen
editarEsta función permite abrir un fichero, devolviendo sobre una variable definida como integer el identificador del fichero.
id = $fopen("archivo.txt"); // crea el fichero archivo.txt
$fclose
editarEsta función permite cerrar un fichero. El fichero a cerrar se especifica mediante el identificador.
id = $fclose(id); // crea el fichero id
$fdisplay
editarEsta función es similar a $display, la diferencia con ésta reside en el lugar donde se imprime el mensaje, en este caso se imprime en un fichero.
$fdisplay(id, "Valor variable A %d, Valor variable B %d", A, B);
$write
editarEsta función es similar a $display, la diferencia con ésta reside en que no existe retorno de carro.
$write("Valor variable A %d, Valor variable B %d", A, B);
$fwrite
editarEsta función es similar a $fdisplay, la diferencia con ésta reside en que no existe retorno de carro.
$fwrite("Valor variable A %d, Valor variable B %d", A, B);
$finish
editarEsta función indica el final de la simulación.
$finish;
$random
editarEsta función retorna un valor aleatorio entero de 32 bits cada vez que se invoca, se le suele suministrar una variable como semilla para la generación del número aleatorio.
A = $random(300);