Bedingte Synthese für Varianten

Gast #2770275
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.
#2770292
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;
Moderator (Firma: Titel) Persönliche Seite #2770311
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... :-(
#2770382
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...
Gast #2770443
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).
Gast #2770547
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?
#2770561
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren