Hallo gibt es eine möglichkeit in VHDL ein unterschiedliches Design in abhängigkeit von der Toolchain(hier: Xilinx, Altera) zu bauen? Also sowas wie in C: [c] #ifdef _XILINXMAKRO_ build Ver1 #elsif _ALTERAMAKRO_ build Ver1 #else // Simulation rest #endif Wie kann man sowas in VHDL umsetzen, wenn es überhaupt geht?
Das geht in VHDL z.B. mit "if...generate" und als Bedingung musst du dann entsprechend ein Generic setzen. Das kannst du von der Toolchain ins Top Level Modul reingeben (zumindest bei Xilinx problemlos).
Hi, die generate Anweisung hätt ich auch als erstes genannt, aber die meisten Toolchains erfordern dabei, dass auch die Designfiles der nicht-generierten Instanzen eingelesen werden. Das gibt immer wieder mal Probleme, wenn sich ein Hersteller nicht genau an den VHDL-Standard (ok, der ist auch wirklich komplex) hält. Die andere Variante ist die per cpp/Makefile, wie z.B. per folgender Regel:
1 | %.vhdl : %.chdl |
2 | cpp -P -o $@ $< |
Nachteil mag sein, dass man vor der grafischen Synthese mit den diversen Klickitools immer ein "make" aufrufen muss, aber die echten Nerds packen auch die ganze Synthese ins Makefile :-) Dritte Variante wäre per configuration. Ziemlich hässlicher Moloch, und ich bin mir nicht mehr sicher, ob nicht die Xilinx-Tools das alles wieder hochwürgen... Beispiel:
1 | configuration gna of soc_top is |
2 | use work.Bla; |
3 | |
4 | for behaviour |
5 | for maybe_foo |
6 | for foo : Blabla |
7 | use entity work.Bla; |
8 | end for; |
9 | end for; |
10 | end for; |
11 | |
12 | end gna; |
Das konfiguriert also die Instanz 'foo', um statt Design 'Blabla' 'Bla' zu nutzen (keine Garantie für Richtigkeit..):
1 | entity soc_top is |
2 | ...
|
3 | end entity soc_top; |
4 | |
5 | architecture behavour of soc_top is |
6 | ...
|
7 | begin
|
8 | maybe_foo: |
9 | if SIMULATION generate |
10 | |
11 | foo: Blabla |
12 | generic map ( |
13 | ...
|
14 | )
|
15 | port map ( |
16 | ...
|
17 | );
|
18 | |
19 | end generate; |
20 | ...
|
21 | |
22 | end behaviour; |
23 | ...
|
Das geht allerdings nur, wenn das Design entsprechend modular ist, und man muss die Hierarchien genau beachten. Grüsse, - Strubi
Strubi schrieb: > Hi, > > die generate Anweisung hätt ich auch als erstes genannt, aber die > meisten Toolchains erfordern dabei, dass auch die Designfiles der > nicht-generierten Instanzen eingelesen werden. Das gibt immer wieder mal > Probleme, wenn sich ein Hersteller nicht genau an den VHDL-Standard (ok, > der ist auch wirklich komplex) hält. > Die andere Variante ist die per cpp/Makefile, wie z.B. per folgender > Regel: > %.vhdl : %.chdl > cpp -P -o $@ $< > > ... > Grüsse, > > - Strubi Hmmm... Das mit generate hatte ich auch im Hinterkopf. Ich hab halt 2 Schaltungsmakros für Altera und Xilinx, und würde halt gern automatisch das richtige auswählen lassen, ohne nochmal irgendwas rumeditieren zu müssen. Generic(oder #defines^^) auf Top-Level Hierachie wären kein allzu großes Problem. Aber da Xilinx die Altera-Schaltmakros wohl nicht akzeptieren wird, wirds mit der if generate Anweisung wohl nicht umzusezten... :( Ja an den Präprozessor hatte ich auch schon gedacht, es ist halt leider nicht gerade die schönste Variante(weil: nicht im Sprachstandard). Aber wenns nicht anders geht werd ichs wohl so machen :)
hmmm schrieb: > Aber da Xilinx die Altera-Schaltmakros wohl nicht akzeptieren wird So ein Makro ist auf VHDL Ebene doch sowieso nur ein Wrapper. Und der kann ja durchaus unabhängig von der Toolchain eingelesen werden. Er muss ja nicht synthetisiert oder gemappt werden... Was mich interessieren würde: welche Makros lassen sich da so einfach austauschen? Auf welcher Ebene bist du da unterwegs?
Christian R. schrieb: > Das geht in VHDL z.B. mit "if...generate" und als Bedingung musst du > dann entsprechend ein Generic setzen. Das kannst du von der Toolchain > ins Top Level Modul reingeben (zumindest bei Xilinx problemlos). Bei Lattice geht das auch.
Also ich habe ein Wrapper der das Interface definiert und das Modul instanziiert. Bei der Synthese wird dann das passende Modul genommen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.