Forum: FPGA, VHDL & Co. Bedingte Synthese für Varianten


von Bronco (Gast)


Lesenswert?

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
end if;

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.

von Kest (Gast)


Lesenswert?

Soetwas macht man mit "generate"-Anweisung (leider ohne else-Zweig)

Kest

von P. K. (pek)


Lesenswert?

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.
1
  DS : if HAS_DEBUGSTUFF = '1' generate
2
    SNP : I2CSNOOP
3
      generic map (
4
        SDADELAY => 3)
5
      port map (
6
        HardResxRN  => SysResxRN,
7
        SysxC       => ABSys200xC,
8
        SclxCI      => USB_SCL,
9
        SdaxDI      => SdaInxD,
10
        SlvAAckxSO  => SnpSlvAAckxS,
11
        SlvANAckxSO => SnpSlvANAckxS,
12
        SlvBAddrxSO => SnpSlvBAddrxS,
13
        CsrFpga     => CsrFpga);
14
  end generate DS;
15
  DSN : if HAS_DEBUGSTUFF = '0' generate
16
    SnpSlvAAckxS  <= '1';
17
    SnpSlvANAckxS <= '1';
18
    SnpSlvBAddrxS <= '1';
19
  end generate DSN;

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


Lesenswert?

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... :-(

von Georg A. (georga)


Lesenswert?

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

von Lattice User (Gast)


Lesenswert?

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

von Bronco (Gast)


Lesenswert?

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?

von P. K. (pek)


Lesenswert?

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

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


Lesenswert?

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!

von Bronco (Gast)


Lesenswert?

Lothar Miller schrieb:
> Diese kleine Modul kann/sollte wie schon erwähnt ein Package sein, das

Okay, danke, das werd ich gleich machen.

von Bronco (Gast)


Lesenswert?

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.

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.