[go: up one dir, main page]

Vai al contenuto

Utente:Fede255/SystemVerilog DPI

Da Wikipedia, l'enciclopedia libera.

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.

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]
  1. Una funzione importata completa la sua esecuzione istantaneamente e non consuma alcun tempo di simulazione. Un task importato può consumare tempo di simulazione.
  2. 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.
  3. 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).
  4. 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.
  5. 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]
  1. Solo le funzioni non-void senza output o input possono essere chiamate come funzioni pure.
  2. Le funzioni specificate come Pure non avranno effetti collaterali, i loro risultati devono dipendere esclusivamente dai valori dei loro argomenti di input.
  3. 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.
  4. Si presume che una funzione Pure non esegua direttamente o indirettamente quanto segue:
    1. Eseguire qualsiasi operazione sui file.
    2. Leggere o scrivere nelle variabili d'ambiente, nella memoria condivisa, nei socket, ecc.
    3. Accedere a qualsiasi dato persistente come variabile globale o statica.
  5. 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]
#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