Programación en Verilog/Funciones y Tareas
FuncionesEditar
Una 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
TareaEditar
Una 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 sistemaEditar
Verilog 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.
$timeEditar
Devuelve el tiempo actual de la simulación
A = $time;
$displayEditar
Imprime 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);
$monitorEditar
Esta 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
$monitoroffEditar
Esta función detiene la monitorización de variables que ejecuta la función $monitor.
$monitoroff;
$monitoronEditar
Esta función habilita la monitorización de variables que ejecuta la función $monitoroff.
$monitoron;
$fopenEditar
Esta 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
$fcloseEditar
Esta función permite cerrar un fichero. El fichero a cerrar se especifica mediante el identificador.
id = $fclose(id); // crea el fichero id
$fdisplayEditar
Esta 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);
$writeEditar
Esta 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);
$fwriteEditar
Esta 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);
$finishEditar
Esta función indica el final de la simulación.
$finish;
$randomEditar
Esta 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);