Ir al contenido

Programación en Verilog/Funciones y Tareas

De Wikilibros, la colección de libros de texto de contenido libre.
← 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 →