Ich erzähle erstmal mein Endziel und dann die Details.
Ich habe ein array auf das ich ein Pointer haben will. Diesen Pointer
will ich über die VHPI Schnittstelle nach Außen in einen C Coprozess
übergeben, um mit C Pointer Operationen das Ramblockfile zu
manipuileren. Etwas trickreich.
Ich brauche einen Call bei Referenz um den gleichen Speicherbereich im
VDHL Simulator und im C Programm zu nutzen.
Ich habe erstmal ein reines VHDL Problem. VHDL lässt die Zuweisung
desRAM_blocks auf den Pointer nicht zu. Hier gibt es bestimmt ein Cast.
1
ram_proc:process
2
variablepointer:ram_byte_ptr;
3
begin
4
ram_byte_ptr:=RAM_BLOCK0;--wie muss diese Zuweisung richtig heißen??
Ich bin mir nicht sicher, aber ich glaube, dass dein
CAST nicht möglich sein wird, da du ja dann deine
Daten mittels ACCESS-Sematik auch zerstören kannst
(also Zugriff auf Nicht-Access-Variablen).
Einfacher Vorschlag: Erzeuge doch einfach einen
Datenblock dynamisch mittels <new...> und kopiere
deine Daten einfach in diesen Block. Dann an
die VHPI-Schnittstelle weiterreichen und dannach
ggf. zerstören.
Hallo Rene,
auf http://vhdl.renerta.com/source/vhd00001.htm habe ich folgende
Hinweise gefunden (weil mich die Sache mit access jetzt selbst
interessiert hat):
Application of access types is restricted to variables: only
variables can be of an access value. Also, only variables can be
designated by an access value.
du versuchst access auf ein Signal (RAM_BLOCK0) anzuwenden, nicht auf
eine Variable.
Although access types are very useful for modeling potentially large
structures, like memories or FIFOs, they are not supported by synthesis
tools.
Willst du irgendwas synthetisierbares erstellen?
> Willst du irgendwas synthetisierbares erstellen?
Ja es soll ein Teil fitbar sein.
Der RAM Block ist vorhanden.
Aber nicht alles, der access pointer muss nicht fitbar sein.
Der RAM_Block ist real vorhanden und ich will mit einer C-Funktion
verschiedene RAM Muster einschleusen und das Ergebnis der Simulation
abgreifen.
Ist Datenblock dynamisch mittels <new...> fitbar?
> Application of access types is restricted to variables: only> variables can be of an access value. Also, only variables can be> designated by an access value.>> du versuchst access auf ein Signal (RAM_BLOCK0) anzuwenden, nicht auf> eine Variable.
Meinst wenn der RAM Block eine variable wäre könnte es klappen?
access ist ja schon eine variable?
Den Vorteil den ich mir erhoffe, ich will den RAM modifizieren und das
ohne einem Bussystem durch alles Instanzen mit Handshake für lesen und
schreiben.
Das Handshake wäre sowieso schwierig. Da nur der VHDL thread events
anschieben kann. Es würde auf ein pollen hinauslaufen.
René D. schrieb:> Meinst wenn der RAM Block eine variable wäre könnte es klappen?
Ja, so hätte ich es interpretiert:
only variables can be of an access value -> ram_byte_ptr muss Variable
sein
only variables can be designated by ... -> RAM_BLOCK0 muss Variable sein
Achim S. schrieb:> René D. schrieb:>> Meinst wenn der RAM Block eine variable wäre könnte es klappen?>> Ja, so hätte ich es interpretiert:>> only variables can be of an access value -> ram_byte_ptr muss Variable> sein> only variables can be designated by ... -> RAM_BLOCK0 muss Variable sein
reicht leider nicht
memory.vhd:43:4: type "ram_byte_ptr" not allowed in an expression
ghdl: compilation error
na ja, die Zuweisung müsste auch nicht an den Typ (ram_byte_ptr:=... )
sondern an die Variable (pointer:=...) gehen. Aber das klappt natürlich
auch nicht, denn es fehlt sozusagen noch der "Adressoperator" für
RAM_BLOCK0.
Alle Codebeispiele, die ich jetzt finden konnte, arbeiten mit new.
Bleibt also wohl nur der Vorschlag von Sigi:
Sigi schrieb:
Leider behindern die Beschränkung der variable das andere Prozesse
darauf zugreifen können. Das würde meinen Code, den ich testen will zu
sehr zerstören.
Das kann durch "shared Variables" umgangen werden.
Funktioniert zumindestens auch unter Xilinx ISim,
und das ist ja nicht der Inbegriff an Fortschritt.
(Beispiel habe ich jetzt gerade nicht zur Hand,
hab's aber schon erfolgreich eingesetzt)
ich ziele auf GHDL
aber das shared variable und ohne access könnte eine Lösung sein.
Brauche mehr info.
Wie weit ist das Scope einer shared variable?
Innerhalb des Files oder des gesamten Projektes?
Könnte die shared varialbe auch in der c-cosimulation auch gültig sein?
Dann könnte ich von außen darauf zugreifen.
Soweit mir bekannt sind SharedVars in Komponenten
(Zugriff nur von Prozessen innerhalb einer Komponente)
als auch in Packages (Zugriff von allen Prozessen
des zugeh. Models) zugelassen. Schau einfach mal
in eines von Peter Ashenden's Bücher nach.
C-Cosimulation: wird leider noch nicht von Xilinx's ISE
unterstützt, keine Ahnung. Und bei QuartusII kenne ich
mich nicht ausreichend aus, GHDL noch weniger.
Moin,
das Problem bei der Instanzierung eines Array innerhalb GHDL ist, den
Zugriff von C sauber zu wrappen, da muss man tief in den GHDL-Interna
herumstochern.
Es ist einfacher, ein RAM einfach zu emulieren. Habe eine Datei als
Beispiel angehängt (aus der ghdlex Co-Simulation Library zu GHDL).
D.h. der C-Seite gehört eigentlich der RAM-Buffer, und VHDL greift drauf
zu. Das ist deutlich einfacher zu handeln.
ghdlex exportiert das RAM auch per netpp aufs Netzwerk, per Python
schreibt man dann relativ simpel:
Übrigens, noch vergessen:
Ich habe gerade die letzten Tage die Erkenntnis erlangt, dass GHDL es
gar nicht mag, wenn ein fremder Thread per VPI (nicht VHPI) Daten
manipuliert.
Heisst, es ist nicht thread-safe.
Deswegen widersetzt sich GHDL auch dem gut gemeinten Ansinnen,
Datenblöcke nach aussen im "Slave"-Modus zu exportieren. Also: GHDL will
immer der Master sein. Datenaustausch zwischen Threads (welche ghdlex
nutzt), gehen nur über FIFOs oder andere emulierte entities mit sauberen
Mutexen und Handshake zwischen den Threads.
Sonst passiert das, was man auch aus zwei unterschiedlichen Clock
domains mit nicht atomischen Änderungen von Bitvectoren (also nix gray
coded) kennt.
Mr. Zulu schrieb:> Was macht denn diese VHPI Schnittstelle genau? Oder was soll sie in> Deinem Fall tun?
Einen Server starten.
Das geht auch schon.
Nun muss der Server Funtionalitäten bekommen. Darunter fallen auch Daten
im VHDL-Simulations thread zu ändern.