# Programación en Verilog/Funciones y Tareas
## Funciones

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.
Un ejemplo de función podría ser el siguiente.

## Tarea

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.
Un ejemplo de tarea es la siguiente.

## Funciones del sistema

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.

### $time

Devuelve el tiempo actual de la simulación

### $display

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:
Caracteres de escape:

### $monitor

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.

### $monitoroff

Esta función detiene la monitorización de variables que ejecuta la función $monitor.

### $monitoron

Esta función habilita la monitorización de variables que ejecuta la función $monitoroff.

### $fopen

Esta función permite abrir un fichero, devolviendo sobre una variable definida como integer el identificador del fichero.

### $fclose

Esta función permite cerrar un fichero. El fichero a cerrar se especifica mediante el identificador.

### $fdisplay

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.

### $write

Esta función es similar a $display, la diferencia con ésta reside en que no existe retorno de carro.

### $fwrite

Esta función es similar a $fdisplay, la diferencia con ésta reside en que no existe retorno de carro.

### $finish

Esta función indica el final de la simulación.

### $random

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.