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
- Una función importada completará su ejecución instantáneamente y consumirá cero tiempo de simulación. Las tareas importadas pueden consumir tiempo.
- 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.
- 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).
- 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.
- 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
- Solo las funciones que no son de tipo Void y que no tienen argumentos de entrada o salida pueden ser llamadas como funciones puras.
- Las funciones especificadas como Puras no deben tener efectos secundarios; sus resultados deben depender únicamente de los valores de sus argumentos de entrada.
- 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.
- Se supone que una función pura no realiza, ni directa ni indirectamente, lo siguiente:
- Realizar cualquier operación de archivo.
- Leer o escribir cualquier cosa en variables de entorno, memoria compartida, sockets, etc.
- Acceda a cualquier dato persistente, como variables globales o estáticas.
- 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 endmoduleReferencias
- Gopi Krishna (09-11-2005). "Tutorial de SystemVerilog DPI" .
- Tutorial de SystemVerilog DPI de Project VeriPage
- Interfaces de programación de aplicaciones
- Lenguajes de verificación de hardware