Programación en Verilog/Funciones y Tareas

← Jerarquía Funciones y Tareas Sintetizabilidad →



Funciones editar

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

Tarea editar

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 sistema editar

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 editar

Devuelve el tiempo actual de la simulación


  A = $time;


$display editar

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);


$monitor editar

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


$monitoroff editar

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


  $monitoroff;


$monitoron editar

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


  $monitoron;


$fopen editar

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


$fclose editar

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


  id = $fclose(id); // crea el fichero id


$fdisplay editar

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);

$write editar

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);


$fwrite editar

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);


$finish editar

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


  $finish;


$random editar

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);



← Jerarquía Funciones y Tareas Sintetizabilidad →