Articulo de referencia

SystemVerilog DPI

La interfaz de programación directa ( DPI ) de SystemVerilog permite la comunicación entre SystemVerilog y otros lenguajes de programación. Estos lenguajes pueden ser C , C++ , ...

La interfaz de programación directa ( DPI ) de SystemVerilog permite la comunicación entre SystemVerilog y otros lenguajes de programación. Estos lenguajes pueden ser C , C++ , SystemC , entre otros. Las DPI constan de dos capas: una capa de SystemVerilog y una capa de lenguaje externo. Ambas capas están aisladas entre sí.

Explicación

La Interfaz de Programación Directa ( DPI ) permite realizar llamadas directas a funciones entre SystemVerilog y otros lenguajes. Las funciones implementadas en otros lenguajes pueden ser llamadas desde SystemVerilog; estas funciones se denominan funciones de importación . De manera similar, las funciones implementadas en SystemVerilog pueden ser llamadas desde otros lenguajes ( C/C++ o System C ); estas funciones se denominan funciones de exportación . Las DPI permiten la transferencia de datos entre dos dominios mediante argumentos y valores de retorno de las funciones.

Importación y exportación de funciones

1) Importación de funciones: Una función implementada en un lenguaje externo puede utilizarse en SystemVerilog mediante su importación. Una función en lenguaje externo utilizada en SystemVerilog se denomina función importada.

Propiedades de la función y tarea importadas

  1. Una función importada completará su ejecución instantáneamente y consumirá cero tiempo de simulación. Las tareas importadas pueden consumir tiempo.
  2. Una función importada puede tener argumentos de entrada, salida e inout.
    • Los argumentos de entrada formales no deben modificarse. Si dichos argumentos se modifican dentro de una función, los cambios no deben ser visibles fuera de la función.
    • La función importada no debe asumir ningún valor inicial para los argumentos de salida formales. El valor inicial de los argumentos de salida es indeterminado y depende de la implementación.
    • Las funciones importadas pueden acceder al valor inicial de un argumento formal de entrada/salida. Los cambios que la función importada realice en un argumento formal de entrada/salida serán visibles fuera de la función.
  3. Una función importada no debe liberar la memoria asignada por el código SystemVerilog ni esperar que el código SystemVerilog libere la memoria asignada por el código externo o (compilador externo).
  4. Una llamada a una tarea importada puede provocar la suspensión del hilo que se está ejecutando. Esto ocurre cuando una tarea importada llama a una tarea exportada y esta última ejecuta una instrucción de control de retardo, control de eventos o espera. Por lo tanto, es posible que una tarea importada esté activa simultáneamente en varios hilos de ejecución.
  5. Una función o tarea importada puede equiparse con propiedades especiales llamadas puras o de contexto.

Tareas y funciones puras y contextuales

funciones puras

Una función cuyos resultados dependen únicamente del valor de sus argumentos de entrada, sin efectos secundarios, se denomina función pura.

Propiedades de las funciones puras

  1. Solo las funciones que no son de tipo Void y que no tienen argumentos de entrada o salida pueden ser llamadas como funciones puras.
  2. Las funciones especificadas como Puras no deben tener efectos secundarios; sus resultados deben depender únicamente de los valores de sus argumentos de entrada.
  3. Una llamada a una función pura puede eliminarse sin problemas si no se necesita su resultado o si sus resultados para el mismo valor de argumentos de entrada están disponibles para su reutilización sin necesidad de recalcularlos.
  4. Se supone que una función pura no realiza, ni directa ni indirectamente, lo siguiente:
    1. Realizar cualquier operación de archivo.
    2. Leer o escribir cualquier cosa en variables de entorno, memoria compartida, sockets, etc.
    3. Acceda a cualquier dato persistente, como variables globales o estáticas.
  5. Una tarea importada nunca puede ser declarada pura.

Tareas y funciones de contexto

Una tarea o función importada que llama a tareas o funciones "exportadas" o accede a objetos de datos de SystemVerilog distintos de sus argumentos reales se denomina tarea o función de contexto.

Propiedades de las tareas y funciones de contexto

1) Una tarea o función importada de contexto puede acceder (leer o escribir) a cualquier objeto de datos de SystemVerilog mediante una llamada a una tarea o función de PLI/VPI o de exportación. Por lo tanto, una llamada a una tarea o función de contexto representa una barrera para la optimización del compilador de SystemVerilog.

Declaración de importación

import " DPI - C " function int calc_parity (input int a);

Declaración de exportación

export "DPI-C" my_cfunction = function myfunction ;

Llamada a funciones de Unix

El código SystemVerilog puede llamar directamente a las funciones de Unix importándolas, sin necesidad de un envoltorio.

Ejemplo de DPI

Llamada a funciones de 'C' en SystemVerilog

Archivo de código C

#include <stdio.h> #include <stdlib.h>extern int add ( void ) { int a = 10 , b = 20 ; a = a + b ;printf ( "Suma exitosa y resultado = %d \n " , a ); return a ; }

archivo de código SystemVerilog

módulo tb_dpi ;import "DPI-C" function int add (); import "DPI-C" function int sleep ( input int secs ); int j ; initial begin $ display ( "Entrando en el bloque inicial de SystemVerilog" ); # 20 j = add (); $ display ( "Valor de J = %d" , j ); $ display ( "Durmiendo durante 3 segundos con la función Unix" ); sleep ( 3 ); $ display ( "Saliendo del bloque inicial de SystemVerilog" ); # 5 $ finish ; end endmodule

Referencias

  • Gopi Krishna (09-11-2005). "Tutorial de SystemVerilog DPI" .
  • Tutorial de SystemVerilog DPI de Project VeriPage