Hallo,
ich habe mehrere VHDL-Projekte, die viele gemeinsame Module teilen.
Ich habe ein Signal, dessen Inhalt bestimmt, um was für ein Projekt es
sich handelt. Diesem Signal wird an einer zentralen Stellen eine
"constant" zugewiesen, deren Inhalt das Projekt identifiziert.
Dieses Signal geht nun durch alle Modulhierachien durch und wird bei
Bedarf in den Modulen ausgewertet.
Das sieht dann beispielhaft so aus:
1
if(ProjektSelekt=x"01")then
2
-- Code für Projekt 1
3
elsif(ProjektSelekt=x"02")then
4
-- Code für Projekt 2
5
--usw.
6
endif;
Nun frage ich mich, ob die Synthese (Xilinx ISE 13.4) so clever ist, um
die nicht benötigten if-Zweige wegzuoptimieren. Eigentlich hätte ich
angenommen, daß das kein Problem sein sollte, aber ein Kollege meint
nun, das ginge nur über zwei Modul-Ebenen hinweg (d.h. die konstante
Zuweisung des Moduls dürfte höchstens eine Ebene höher erfolgen, damit
es optimiert wird).
Was sagen sie Experten?
Und noch eine peinliche Frage:
Man kann das doch bestimmt irgendwo in Reports oder Netzlisten oder so
sehen. Wo müßte ich denn da gucken?
Danke.
Ich habe kürzlich ähnlich Strukturen benutzt, und den Verdacht gehabt,
dass es mit der Optimierung nicht in jedem Fall klappt.
Was immer tut, sind GENERATES. Wenn Du also deine Varianten soweit als
möglich mit Kontanten-basierten GENERATES machst, fährst Du gut.
z.B.
Bronco schrieb:> Diesem Signal wird an einer zentralen Stellen eine> "constant" zugewiesen, deren Inhalt das Projekt identifiziert.
Sowas macht man nicht über Signale in der Port-Liste (das geht nicht mal
über 1 Ebene), sondern über Generics. Da weiß der Synthesizer genau,
dass sich nichts mehr ändert.
Kest schrieb:> Soetwas macht man mit "generate"-Anweisung (leider ohne else-Zweig)
Warum leider? Im gezeigten Codeteil gibt es auch kein else...
Aber es gibt leider tatsächlich keinen "Default-Generate-Block", der
erzeugt wird, wenn sonst nichts passt... :-(
> Warum leider? Im gezeigten Codeteil gibt es auch kein else...
Weil man sonst einen Abbruch der Synthese provozieren könnte, wenn über
die Generates zB. eine ungültige Konfiguration reinkommt. Gerade bei
generischen Codes aus recycleten Packages wäre das schon hilfreich.
Sonst läuft alles durch, geht aber trotzdem nicht...
Es ist mir ziemlich schleierhaft, warum es kein elsif-generate oder
case-generate gibt, ich tippe einfach mal auf "verpennt". Ein
technischer Grund kanns eigentlich nicht sein. VHDL2008 soll es ja
haben, die Tools werden das vermutlich in 20 Jahren dann mal
unterstützen...
Ich hab auch schon mal versucht, das zumindest für die Simulation
erkennbar zu machen (mit Signalzuweisungen in den generates + asserts,
auch über resolutions), habs aber nicht hinbekommen...
Georg A. schrieb:> VHDL2008 soll es ja> haben, die Tools werden das vermutlich in 20 Jahren dann mal> unterstützen...
Synplify Pro (in Lattice Diamond enthalten) unterstützt VHDL 2008. Ich
kann jetzt nicht übersehen ob alles, aber elif/else generate, und case
generate auf jedem Fall.
Ab Version 9 (in Diamond 2.0 enthalten) gilt das auch für den Aldec
Simulator (Active HDL).
Lothar Miller schrieb:> Sowas macht man nicht über Signale in der Port-Liste (das geht nicht mal> über 1 Ebene), sondern über Generics. Da weiß der Synthesizer genau,> dass sich nichts mehr ändert.
Das Problem ist:
Es gibt ein kleines Modul, wo die Projekt-Selektierung gemacht wird,
welches das Ergebnis an das Top-level-Modul weiter gibt, da das
Top-Level-Modul einheitlich sein soll. Ich brauche also am
Projekt-Selekt-Modul einen Ausgang (im Augenblick eben PORT OUT).
Nun dachte ich, gelernt zu haben, daß Generics immer Eingänge sind und
nicht als Ausgänge benutzt werden können, oder?
Ich habe meine "Entscheidungsträger" (z.B. HAS_DEBUGSTUFF) als globale
Konstanten in ein Package versorgt (die dann im gesamten Design bekannt
sind). Damit hast Du dann keine in/out-Probleme mehr. Falls Du aber die
Generates mal so mal anders (mehrere Instanzen derselben Entity mit
verschiedenen Generates in denselben Design) brauchst, dann kommst Du um
Generics wohl kaum herum...
Bronco schrieb:> Es gibt ein kleines Modul, wo die Projekt-Selektierung gemacht wird,
Diese kleine Modul kann/sollte wie schon erwähnt ein Package sein, das
dann an den passenden Stellen direkt eingebunden werden kann. Dann sieht
der Synthesizer sofort: Aha, eine Konstante. Optimieren!
Peter K. schrieb:> Ich habe meine "Entscheidungsträger" (z.B. HAS_DEBUGSTUFF) als globale> Konstanten in ein Package versorgt (die dann im gesamten Design bekannt> sind).
Dir auch nochmal danke! Hab's jetzt genau so umgesetzt.