Verloren legen, den Originaltext reproduzieren:
https://blog.csdn.net/qq_31348733/article/details/101054625
1. Die Bedeutung des Kontexts
Der Kontext einer importierten Funktion ist der Ort, an dem die Funktion definiert wird, z. B. $unit, Modul, Programm oder Paketbereich (Scope), der mit der normalen SV-Methode identisch ist. Wenn Sie eine Funktion in zwei verschiedene Bereiche importieren, wird der entsprechende C-Code entsprechend dem Kontext der Importanweisung ausgeführt. Dies ähnelt der Definition einer run()-Aufgabe in zwei verschiedenen Modulen von SV, und jede Aufgabe greift explizit auf die internen Variablen ihres eigenen Moduls zu.
Hier ist ein Beispiel für eine C-Methode, die je nach Kontext der Import- und Exportanweisungen unterschiedliche SV-Methoden aufruft:
//top.sv
Moduloberseite;
Importieren Sie den Kontext „DPI-C“.
endmodule:top
2. Legen Sie den Umfang der importierten Funktionen fest
So wie SV-Code Methoden im lokalen Bereich aufrufen kann, können importierte C-Methoden auch Methoden außerhalb ihres Standardkontexts aufrufen. Verwenden Sie die svGetScope-Methode, um ein Handle für den aktuellen Bereich zu erhalten, das dann in einem Aufruf von svGetScope verwendet werden kann, um dem C-Code den Eindruck zu vermitteln, dass es sich um einen anderen Kontext handelt.
Hier ist ein Beispiel:
Die erste Methode save_my_scope() speichert den Bereich, in dem sie im SV aufgerufen wurde
Die zweite Methode c_display() setzt ihren Geltungsbereich auf den gespeicherten Geltungsbereich und gibt die Informationen aus
//c_display.c
#include <stdio.h>
#include <svdpi.h>
extern void sv_display();
svScope my_scope;
void save_my_scope(){
my_scope = svGetScope();
}
void c_display(){
// Den aktuellen Bereich ausgeben
io_printf("C:c_display aufgerufen aus Bereich %s\n", svGetNameFromScope(svGetScope()));
// neuen Bereich festlegen
//io_prinf("scope: %s", svGetNameFromScope(svGetScope()));
svSetScope(my_scope);
io_printf("C:calling %s.sv_display\n", svGetNameFromScope(svGetScope()));
sv_display();
}
Der obige C-Code ruft svGetNameFromScope() auf, das eine Zeichenfolge zurückgibt, die den aktuellen Bereich darstellt. Der zurückgegebene Bereich wird zweimal gedruckt, einmal mit dem Bereich, als der C-Code zum ersten Mal aufgerufen wurde, und einmal mit dem zuvor gespeicherten Bereich.
Im folgenden SV-Codecode ruft der erste Modulblock eine C-Methode auf, um Kontextinformationen zu speichern. Wenn das oberste Modul die Methode c_display() aufruft, setzt die Methode den Gültigkeitsbereich zurück auf Block, sodass sie sv_display() im Blockmodul anstelle der gleichnamigen Methode im obersten Modul aufruft
//top.sv
`Zeitskala1ns/1ns
Moduloberseite;
//============================================= =====================\
// ********** Parameter und interne Signale definieren ***************
//============================================= =====================/
//============================================= ======================
// *************** Haupt code ****************
//============================================= ======================
Importieren Sie die Kontextfunktion „DPI-C“ void c_display();
exportieren Sie die Funktion „DPI-C“ sv_display;
Funktion void sv_display();
$display("SV:top %m");
Endfunktion
Block b1();
Anfang beginnen
#1 c_display();
Ende
endmodule:top
Modulblock;
Importieren Sie die Kontextfunktion „DPI-C“ void c_display();
Importieren Sie die Kontextfunktion „DPI-C“ void save_my_scope();
exportieren Sie die Funktion „DPI-C“ sv_display;
Funktion void sv_display();
$display("SV:block %m");
Endfunktion
Anfang beginnen
save_my_scope();
c_display();
Ende
endmodule:block
Das Folgende ist das Ergebnis der Ausführung des Programms
# C:c_display aus dem Bereich top.b1 aufgerufen
# C: top.b1.sv_display aufrufen
# SV:block top.b1.sv_display
# C:c_display vom oberen Bereich aus aufgerufen
# C: top.b1.sv_display aufrufen
# SV:block top.b1.sv_display
————————————————
Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des CSDN-Bloggers „Advanced Obsessive-Compulsive Disorder“ und folgt der Urheberrechtsvereinbarung CC 4.0 BY-SA. Zum Nachdruck fügen Sie bitte den Original-Quellenlink und diese Erklärung bei.
Ursprünglicher Link: https://blog.csdn.net/qq_31348733/article/details/101054625