Gast
#2530897
Hallo zusammen, vielleicht weiß jemand etwas zur geschickten Parametrisierung von VHDL Instanzen. Und zwar habe ich ein Top-Level Modul welches eine relativ aufwändige Pipeline realisiert. Dies geschieht mit mehreren Untermodulen, embedded DSPs und auch IP cores die alle ein bestimmtes Delay haben. Das Top-Level Modul ist parametrierbar bzgl. der Eingangsbitbreiten und hat auch noch ein paar andere Abhängigkeiten (z.B. Reduktionsprimzahl und Konstanten) die als generic übergeben werden. Für wechselnde generics werden dann in den Untermodulen mit if generate die passenden Blöcke, wie z.B. schon vorgefertigte IP Cores für die Multiplikation (wegen Abhängigkeit von der Breite der Eingänge, und da für Cores ja leider keine support für VHDL generics besteht) oder ein modularer Reduzierer (speziell auf die gewählte Reduktionsprimzahl zugeschnitten) ausgewählt. Jetzt geht es darum, dass eine Oberkomponente wissen muss, wie viele Takte delay ihre instantiierten Unterkomponenten haben um selber zu wissen, wann gültige Werte am Ausgang der Pipeline anliegen. Diese Oberkomponente hat auch wieder eine Oberoberkomponente, die wiederum das Delay wissen muss. Delays können sich z.B. ändern, wenn ich an einigen Stellen noch Register einfügen muss, um das Timing einhalten zu können oder eine Optimierung finde, die Register überflüssig macht. Jetzt hatte ich gedacht, ich könnte einfach den delay einer Komponente A als "quasi-konstanten" out port in der Entity declaration angeben. Wenn die Komponente B die Komponente A instantiiert hätte sie diesen Wert und wüsste über das Delay Bescheid. Leider funktioniert das so nicht, da der output port in der instantiierenden Komponente B nicht als konstant markiert wird. Dies ist wichtig, da abhängig vom delay in A z.b. Schieberegister einer bestimmten Länge von B instantiiert werden. Was ich also suche, sind umgekehrte generics, d.h. ich will Konstanten (oder noch besser Werte die zur Synthesezeit abhänig von generics ausgerechnet wurden) an die instantiierende Oberkomponente (zurück) übergeben. Eine relative „einfache“ Möglichkeit dies teilweise zu realisieren wäre ein Package zu deklarieren, in dem ich für jedes Modul das delay als constant eintrage. Problem ist allerdings, dass ich dann natürlich auch bei jeder Änderung im Code der Komponente die Einfluss auf das delay hat, auch den Eintrag in der Packagedefinition ändern muss (fehleranfällig). Zusätzlich würde ich das delay gerne auch von den tatsächlich über if generate instantiierten Komponenten abhängig machen und komme dann mit der Package Lösung nicht weiter. Prinzipiell realisierbar sollte das alles sein, da alles zur Synthesezeit ablaufen soll, die Frage ist nur wie man so etwas schön mit VHDL Bordmitteln realisiert. Vielleicht hat ja wer eine gute Idee oder kennt eventuell Compiler Optionen die „quasi-konstante“ out Ports erlauben oder andere obskure VHDL Features mit denen dies möglich ist. Achja, ich arbeite mit Xilinx ISE 13 und würde auch gerne den normalen graphischen „Klick auf Knopf“ Designflow beibehalten und keinen Präprozessor einbauen. Vielen Dank im Voraus