Forum: FPGA, VHDL & Co. Unterschiedliches Design eh nach Toolchain bauen


von hmmm (Gast)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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).

von Strubi (Gast)


Lesenswert?

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

von hmmm (Gast)


Lesenswert?

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 :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Lattice User (Gast)


Lesenswert?

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.

von user (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.