[Nachdruck] Die Bedeutung des System Verilog-Kontextkontexts und der Umfang der Einstellung der importierten Funktion

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

Supongo que te gusta

Origin blog.csdn.net/m0_38037810/article/details/129377399
Recomendado
Clasificación