API del lenguaje de descripción de hardware
La interfaz de programación directa ( DPI) de SystemVerilog es una interfaz que se puede utilizar para interconectar SystemVerilog con lenguajes extranjeros. Estos lenguajes extranjeros pueden ser C , C++ , SystemC y otros. Las DPI constan de dos capas: una capa de SystemVerilog y una capa de lenguaje extranjero. Ambas capas están aisladas entre sí.
Explicación
La interfaz de programación directa ( DPI ) permite llamadas directas a funciones entre lenguajes, entre SystemVerilog y lenguajes externos. Las funciones implementadas en lenguajes externos pueden ser llamadas desde SystemVerilog y dichas funciones se denominan funciones de importación . De manera similar, las funciones implementadas en SystemVerilog pueden ser llamadas desde lenguajes externos ( C/C++ o System C ); dichas funciones se denominan funciones de exportación . Las DPI permiten la transferencia de datos entre dos dominios a través de argumentos de función y retorno.
Función de importación y exportación
1) Importación de funciones: una función implementada en un idioma extranjero se puede utilizar en SystemVerilog importándola. Una función en un idioma extranjero utilizada en SystemVerilog se denomina función importada.
Propiedades de la función y tarea importadas
- Una función importada debe completar su ejecución instantáneamente y no consumir tiempo de simulación. Una tarea importada puede consumir tiempo.
- La función importada puede tener argumentos de entrada, salida y entrada-salida.
- Los argumentos de entrada formales no se deben modificar. Si dichos argumentos se modifican dentro de una función, los cambios no serán visibles fuera de la función.
- La función importada no debe asumir ningún valor inicial de los argumentos de salida formales. El valor inicial de los argumentos de salida no está determinado y depende de la implementación.
- La función importada puede acceder al valor inicial de un argumento inout formal. Los cambios que la función importada realiza en un argumento inout formal deben ser 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 subproceso que se está ejecutando actualmente. Esto ocurre cuando una tarea importada llama a una tarea exportada y la tarea exportada ejecuta un control de demora, un control de evento o una instrucción de espera. Por lo tanto, es posible que una tarea importada esté activa simultáneamente en varios subprocesos de ejecución.
- Una función o tarea importada puede estar equipada con propiedades especiales llamadas puras o de contexto.
Tareas y funciones puras y de contexto
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
- Sólo las funciones no nulas sin argumentos de salida o entrada pueden llamarse como funciones puras.
- Las funciones especificadas como puras no tendrán efectos secundarios, sus resultados deben depender únicamente de los valores de sus argumentos de entrada.
- Una llamada de función pura se puede eliminar de forma segura si su resultado no es necesario o si sus resultados para el mismo valor de argumentos de entrada están disponibles para su reutilización sin necesidad de volver a calcular.
- Se supone que una función pura no realiza directa o indirectamente lo siguiente:
- Realizar cualquier operación de archivo.
- Leer o escribir cualquier cosa en la variable de entorno, memoria compartida, sockets, etc.
- Acceda a cualquier dato persistente como variable global o estática.
- Una tarea importada nunca puede declararse como pura.
Tareas y funciones contextuales
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 (PLI/VPI) o una llamada a una tarea o función de exportación. Por lo tanto, una llamada a una tarea o función de contexto es una barrera para la optimización del compilador de SystemVerilog.
Declaración de importación
importar " DPI - C " función int calc_parity (entrada int a);
Declaración de exportación
exportar "DPI-C" my_cfunction = función myfunction ;
Llamada a funciones Unix
El código SystemVerilog puede llamar a funciones Unix directamente importándolas, sin necesidad de un contenedor.
Ejemplo de DPI
Llamada a funciones 'C' en SystemVerilog
C - archivo de código
#include <stdio.h> #include <stdlib.h> externo int add () { int a = 10 , b = 20 ; a = a + b ; printf ( "Suma exitosa y resultado = %d \n " , a ); return a ; }
Archivo de código de 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 (9 de noviembre de 2005). "Tutorial de DPI de SystemVerilog".
- Tutorial de DPI de SystemVerilog del proyecto VeriPage