Hallo,
ich möchte gerne in VHDL ein Signal setzen. Für Simulation und Synthese
soll aber jeweils ein anderer Wert gesetzt werden.
Geht das? Bzw. wie kann ich in VHDL herausfinden, ob ich mich gerade in
der Simulation oder in der Synthese befinde?
MfG
dito schrieb:> ich möchte gerne in VHDL ein Signal setzen. Für Simulation und Synthese> soll aber jeweils ein anderer Wert gesetzt werden.
Warum?
Was willst du mit sowas denn eigentlich erreichen?
Ich mache das, damit z.B. mein Softcore in der Simulation ein paar
lange/langweilige Initialisierungen wegläßt und gleich in sein
Testprogramm springt.
Genausogut, kann man damit einen UART schneller laufen lassen, damit man
schneller was sieht:
Noch schöner gehts mit VHDL 2008: Da kann man mit den so genannten
"Hierarchical names" aus der Testbench heraus direkt die entsprechenden
Signale in seinem Design überschreiben. Dadurch hat man keinen
Simulationscode im eigentlichen Design, sondern kann alles
zusammengefasst in die Testbench schreiben.
Klaus schrieb:> Noch schöner gehts mit VHDL 2008: Da kann man mit den so genannten> "Hierarchical names" aus der Testbench heraus direkt die entsprechenden> Signale in seinem Design überschreiben. Dadurch hat man keinen> Simulationscode im eigentlichen Design, sondern kann alles> zusammengefasst in die Testbench schreiben.
Ich erkenne den Zusammenhang mit der Frage nicht...
Heinrich H. schrieb:> Ich erkenne den Zusammenhang mit der Frage nicht...
Das ist schade für dich, ändert aber nicht an der Korrektheit meiner
Antwort ;-)
Also nochmal anders formuliert: Es ging darum eine Variable (oder
Signal, oder was auch immer) in der Simulation mit einem anderen Wert zu
versehen, also bei der Synthese. Dazu kann man den Synthese-Wert ganz
normal ins Design schreiben. Für die Simulation wird dieser Wert einfach
aus der Testbench heraus mit einem anderen Wert überschrieben. Dies ist
unter VHDL 2008 möglich, da man über hierarchische Signalnamen direkt
auf Signale untergeordneter Module zugreifen kann, obwohl die Signal auf
der oberen Ebene eigentlich gar nicht sichtbar wären. Und man kann nicht
nur einfach lesend drauf zugreifen, man kann den Wert des Signal
überschreiben.
>> Dadurch hat man keinen Simulationscode im eigentlichen Design,>> sondern kann alles zusammengefasst in die Testbench schreiben.> Ich erkenne den Zusammenhang mit der Frage nicht...
Naja, die Originalaufgabe war ja:
>>>> Für Simulation und Synthese soll aber jeweils ein anderer Wert>>>> gesetzt werden.
Wenn in der Synthese ein Signal statisch anders gesetzt wird, dann wird
das (hoffentlich) irgendwie rausoptimiert. Und deshalb ist es in jedem
Fall der bessere Weg, die Beschriebung für die Synthese "korrekt und
konsistent" zu halten, und irgendwelche Simulationstricks "aussen rum"
zu basteln.
EDIT: zu spät... ;-)
Lothar Miller schrieb:> Wenn in der Synthese ein Signal statisch anders gesetzt wird, dann wird> das (hoffentlich) irgendwie rausoptimiert. Und deshalb ist es in jedem> Fall der bessere Weg, die Beschriebung für die Synthese "korrekt und> konsistent" zu halten, und irgendwelche Simulationstricks "aussen rum"> zu basteln.
Genau das war auch meine Absicht... ;-)
Echt mal, einfach einen Generic. Du kannst bei XST sogar gleich den Wert
der Generics mit angeben. Wird ja auch beim MGT beispielsweise so
gemacht, um die lange Init- und Reset-Sequenz für die Simulation
abzukürzen.
Wie man sieht, viele Wege führen nach Rom (oder Athen?).
Die reine Lehre den Simulationscode getrennt vom Synthesecode zu halten,
habe ich auch einmal verfolgt. Aber spätestens bei einem komplexen
Design, wo man sich mal ein paar Zwischenergebnisse in einer Datei
mitloggen möchte (Filterausgang, Instruction o.ä.) will ich nicht mehr
alles über's Toplevel nach draußen führen. Da werden dann Instanzen
belästigt, die nix damit zu tun haben. Ich weiß, es gibt Lösungen dafür:
Modelsim-Signalspy (fällt, aus, da proprietär) und die erwähnten
deep-names in VHDL-2008 (noch relativ jung). Ein global-package wäre
auch noch eine Variante, die aber auch nicht wirklich elegant ist.
Deshalb kommt ein Teil des Simulationscode mit in den Synthesecode und
gut ist.
Schönes Wochenende!
Duke
berndl schrieb:> mich wundert, dass noch niemand GENERICS im Toplevel und darunter> erwaehnt hat...
An Generics habe ich schon gedacht. Nur wollte ich diese nicht durch
alle Hierachien des Designs (von TB zu betreffender Komponente), wenn
ich es genauso mit einer Anweisung (wie Duke oben beschrieben lösen
kann).
dito schrieb:> berndl schrieb:>> mich wundert, dass noch niemand GENERICS im Toplevel und darunter>> erwaehnt hat...>> An Generics habe ich schon gedacht. Nur wollte ich diese nicht durch> alle Hierachien des Designs (von TB zu betreffender Komponente), wenn> ich es genauso mit einer Anweisung (wie Duke oben beschrieben lösen> kann).
Das ist eine Schwäche von VHDL. Bei größeren Designs von Vorteil, dass
es kein Chaos gibt.
Ich hätte auch manchmal auch gerne ein paar Möglichkeiten, die in
objektorientierten Programmiersprachen gibt.