SystemVerilog DPI (Direct Programming Interface) è un meccanismo a supporto dell'interfacciamento tra SystemVerilog e altri linguaggi di programmazione, quali ad esempio C, C++, SystemC. Un'interfaccia DPI è costituita da due livelli: un livello SystemVerilog e un livello in un linguaggio differente. Entrambi i livelli sono isolati l'uno dall'altro.
Panoramica
[modifica | modifica wikitesto]L'interfaccia di programmazione diretta (DPI) consente chiamate dirette di funzioni tra SystemVerilog e un linguaggio differente. Le funzioni implementate nell'altro linguaggio possono essere richiamate da SystemVerilog e sono dette Import function. Allo stesso modo, le funzioni implementate in SystemVerilog possono essere chiamate dall'altro linguaggio e sono dette Export function. Le interfacce DPI consentono il trasferimento di dati tra due domini tramite gli argomenti delle funzioni e i valori di ritorno.
Importazione ed esportazione di funzioni
[modifica | modifica wikitesto]Una funzione implementata in un linguaggio diverso può essere utilizzata in SystemVerilog importandola. Una funzione in un linguaggio diverso utilizzata in SystemVerilog è chiamata funzione importata.
Proprietà delle funzioni e dei task importati
[modifica | modifica wikitesto]- Una funzione importata completa la sua esecuzione istantaneamente e non consuma alcun tempo di simulazione. Un task importato può consumare tempo di simulazione.
- La funzione importata può avere argomenti di input, output e inout.
- Gli argomenti di input non devono essere modificati. Se tali argomenti vengono modificati all'interno di una funzione, le modifiche non saranno visibili all'esterno della funzione.
- La funzione importata non deve assumere alcun valore iniziale degli argomenti di output formali. Il valore iniziale degli argomenti di output è indeterminato e dipende dall'implementazione.
- La funzione importata può accedere al valore iniziale di un argomento inout formale. Le modifiche apportate dalla funzione Imported a un argomento inout formale devono essere visibili all'esterno della funzione.
- Una funzione importata non deve liberare la memoria allocata dal codice SystemVerilog né aspettarsi che il codice SystemVerilog liberi la memoria allocata dal codice esterno (o compilatore esterno).
- Una chiamata a un task importato può comportare la sospensione del thread attualmente in esecuzione. Ciò si verifica quando un task importato chiama un task esportato e il task esportato esegue un controllo di ritardo, un controllo evento o un'istruzione di wait. Pertanto è possibile che un task importato sia attivo contemporaneamente in più thread di esecuzione.
- Una funzione o task importati può essere dotata di proprietà speciali denominate pure o context.
Task e funzioni puri e di contesto
[modifica | modifica wikitesto]Funzioni pure
[modifica | modifica wikitesto]Una funzione i cui risultati dipendono esclusivamente dal valore dei suoi argomenti di input senza effetti collaterali è chiamata funzione pura.
Proprietà delle funzioni pure
[modifica | modifica wikitesto]- Solo le funzioni non-void senza output o input possono essere chiamate come funzioni pure.
- Le funzioni specificate come Pure non avranno effetti collaterali, i loro risultati devono dipendere esclusivamente dai valori dei loro argomenti di input.
- Una chiamata di funzione Pure può essere tranquillamente eliminata se il suo risultato non è necessario o se i suoi risultati per lo stesso valore degli argomenti di input sono disponibili per il riutilizzo senza dover ricalcolare.
- Si presume che una funzione Pure non esegua direttamente o indirettamente quanto segue:
- Eseguire qualsiasi operazione sui file.
- Leggere o scrivere nelle variabili d'ambiente, nella memoria condivisa, nei socket, ecc.
- Accedere a qualsiasi dato persistente come variabile globale o statica.
- Un task importato non può mai essere dichiarato Pure.
Task e funzioni di contesto
[modifica | modifica wikitesto]Un'attività o una funzione importata che chiama attività o funzioni "esportate" o accede a oggetti di dati SystemVerilog diversi dai suoi argomenti effettivi è chiamata attività o funzione di contesto.
Proprietà dei task e delle funzioni di contesto
[modifica | modifica wikitesto]1) Un'attività o una funzione importata dal contesto può accedere (in lettura o scrittura) a qualsiasi oggetto dati SystemVerilog chiamando (PLI/VPI) o chiamando l'attività o la funzione di esportazione. Pertanto, una chiamata all'attività o alla funzione Context rappresenta un ostacolo per l'ottimizzazione del compilatore SystemVerilog.
Dichiarazioni di importazione
[modifica | modifica wikitesto]import "DPI-C" function int calc_parity (input int a);
Dichiarazioni di esportazione
[modifica | modifica wikitesto]export "DPI-C" my_cfunction = function myfunction;
Chiamata di funzioni Unix
[modifica | modifica wikitesto]Il codice SystemVerilog può chiamare le funzioni Unix direttamente importandole, senza bisogno di un wrapper.
Esempio di interfaccia DPI
[modifica | modifica wikitesto]Chiamata di funzioni 'C' in SystemVerilog
[modifica | modifica wikitesto]Codice C
[modifica | modifica wikitesto]#include <stdio.h>
#include <stdlib.h>
extern int add() {
int a = 10, b = 20;
a = a + b;
printf("Addition Successful and Result = %d\n", a);
return a;
}
Codice SystemVerilog
[modifica | modifica wikitesto]module tb_dpi;
import "DPI-C" function int add();
import "DPI-C" function int sleep(input int secs);
int j;
initial
begin
$display("Entering in SystemVerilog Initial Block");
#20
j = add();
$display("Value of J = %d", j);
$display("Sleeping for 3 seconds with Unix function");
sleep(3);
$display("Exiting from SystemVerilog Initial Block");
#5 $finish;
end
endmodule
Riferimenti
[modifica | modifica wikitesto]- http://www.testbench.in.
- SystemVerilog DPI Tutorial from Project VeriPage