Forum: FPGA, VHDL & Co. SDC File erstellen


von Christian W. (clupus)


Lesenswert?

Hallo allerseits,

ich bin gerade am Programmieren mit Quartus II und will mal testen, wie 
schnell ich ein Design machen kann. (Ich habe einen ADC per LVDS an den 
FPGA angeschlossen. Jetzt will ich wissen, bis zu welcher Frequenz ich 
hoch gehen kann.)

Leider habe ich mich bisher nicht mit dem Schreiben einer SDC Datei 
auseinander gesetzt. Ich habe eine grundsätzliche Struktur (großteils 
aus dem Netz abgekupfert) aber das wird mir jetzt wohl nicht mehr viel 
helfen.

Daher:
1. Wo kann ich mich mal informieren, was alles in eine SDC Datei rein 
muss, was kann?
2. Woher weiß ich was ich alles (in der Datei) fordern muss?
3. Wie muss ich die Reports lesen? Wenn ich jetzt die Meldung bekomme 
"Timing contraints not met", was kann ich dann tun und wie weiß ich wo's 
klemmt?

Das ist jetzt vielleicht ein bisschen viel auf einmal, aber ich habe 
(bisher) noch nicht wirklich viel zu dem Thema SDC gefunden. Daher war 
meine bisherige Recherche leider nicht sehr erfolgreich...

Christian

von Kest (Gast)


Lesenswert?

Da hast Du Dir was vorgenommen! Das Thema ist verdammt komplex. Um zu 
sehen, wie schnell Dein Design sein könnte ist der erste Anhaltspuinkt 
"fmax summary" bei TimingQuest Timing Analyser (reports).

Was ich immer reinschreibe ist:
# PLL
derive_pll_clocks -create_base_clocks

# compute the jitter behavior of the PLLs
derive_clock_uncertainty

# Definition of additional Base clocks
create_clock -name FPGA_CLK_50_IN -period "50 MHz" [get_ports 
FPGA_CLK_50_IN]

damit ist zumindest ein Grundgerüst gelegt.

Dann kommen noch set_clock_groups und set_false_path, aber da muss man 
sehen.

Und wenn erstmal die ganzen IOs constraint werden müssen, dann gute 
Nacht ;-)

Grüße
Kest

von P. K. (pek)


Lesenswert?

> 1. Wo kann ich mich mal informieren, was alles in eine SDC Datei rein
> muss, was kann?

Wenn Du mit Quartus arbeitest, würde ich zu Beginn mal das TimeQuest 
Tutorial durchspielen. Gibt mal so einen Überblick über die ganze 
Timing-Constraints-Geschichte.

> 2. Woher weiß ich was ich alles (in der Datei) fordern muss?

Das findest Du in Deiner Spezifikation. Die dort definierten 
Timing-Parameter gibst Du dann dem Synthese- bzw. P&R/Mapping-Tool 
mittels SDC mit. Absolutes Minimum sind Definition der Eingangs-Clock(s) 
und dass er interne PLL-Clocks(s) herleiten soll. z.B.:

create_clock -name {CLK50} -period 20.000 -waveform { 0.000 10.000 } 
[get_ports {CLK50}]

derive_pll_clocks
derive_clock_uncertainty

Je nach Bedürfnis kommen dann noch Eingangs- und Ausgangs-Timings, 
false_path (nicht zu berücksichtigen). multicycle Pfad (Berechnung darf 
länger dauern) usw. dazu.

> 3. Wie muss ich die Reports lesen? Wenn ich jetzt die Meldung bekomme
> "Timing contraints not met", was kann ich dann tun und wie weiß ich wo's
> klemmt?

Damit sagt dir Quartus, ob er Deine Vorgaben aus 2. erfüllen konnte. 
Auch hier gibt das Tutorial einen guten Start.

von Christian W. (clupus)


Lesenswert?

Hallo,

also das Tutorial habe ich mir mal angesehen (schon früher darüber 
gestolpert). Das war soweit auch (in großen Teilen) einleuchtend.

Mein SDC File besteht im wesentlichen aus der Definition meiner zwei 
Clocks (Haupttakt und LVDS Takt) und den Sachen zum automatischen 
Erzeugen der PLL Einträge:
1
create_clock -name CLK_25MHz -period 40.000 ...
2
chreate_clock -name LVDS_CLK -period 5.556 ...
3
derive_pll_clocks
4
derive_clock_uncertainty

Was heißt hier in meiner Spezifikation? Meinst du die Datenblätter der 
angeschlossenen Bauteile oder was meinst du mit Spezifikation? Oder 
anders gesagt: Wie kann ich das genau spezifizieren, wenn keine 
Spezifikation vorliegt?

Mir ist aufgefallen, dass alle (?) meine Pfade, die Probleme machen, am 
Übergang zwischen verschiedenen Takten auftreten. Wenn also z.B. mit 
Takt A Daten aktualisiert werden, die mit Takt B gespeichert (im 
Register) und dann dort weiterverarbeitet werden.
Hier habe ich im Netz gelesen, dass man ggf mit false_path oder 
multicycle das Problem lösen kann.
"Darf" ich das in solch einem Fall sinnvollerweise machen oder gibt das 
Probleme?

Christian

von P. K. (pek)


Lesenswert?

Christian Wolf schrieb:
> Was heißt hier in meiner Spezifikation? Meinst du die Datenblätter der
> angeschlossenen Bauteile oder was meinst du mit Spezifikation?

Einerseits die angeschlossenen Bauteile: Daraus ergeben sich die 
Anforderungen an die Inputs/Outputs.

Andererseits die Spezifikation (=Anforderungen), was Dein FPGA machen 
muss: In welcher Zeit muss es welche und wieviel Daten wohin schaufeln, 
zwischenspeichern und bearbeiten. Daraus ergibt sich dann erstens was 
für ein FPGA Du nehmen musst um alles reinzukriegen (Grösse), und 
zweitens wie schnell Du intern arbeiten sollst (Speedgrade), und wie 
hoch Du allenfalls parallelisieren musst.

von Johannes E. (cpt_nemo)


Lesenswert?

Christian Wolf schrieb:
> Wenn also z.B. mit
> Takt A Daten aktualisiert werden, die mit Takt B gespeichert (im
> Register) und dann dort weiterverarbeitet werden.
> Hier habe ich im Netz gelesen, dass man ggf mit false_path oder
> multicycle das Problem lösen kann.
> "Darf" ich das in solch einem Fall sinnvollerweise machen oder gibt das

Mit false_path sagst du Quartus, dass es sich gar nicht um irgend welche 
Timings in diesem Pfad kümmern soll; du musst dann selber dafür sorgen, 
dass es bei der Datenübergabe zwischen den beiden Takt-Domänen kein 
Problem gibt.

Das kann man z.B. machen, idem man ein Register dazwischenschaltet, 
welches mit dem Takt der Quelle arbeitet und das mit einem Enable-Signal 
die Daten übernimmt.
Danach wird das Enable weggenommen und das Register mit dem anderen Takt 
kann jetzt die Daten irgendwann übernehmen; solange bleibt das Enable 
des ersten Registers aus. Erst wenn das zweite Register die Daten 
übernommen hat, darf das erste Register wieder neue Daten empfangen.

von P. K. (pek)


Lesenswert?

Johannes E. schrieb:
> Das kann man z.B. machen, idem man ein Register dazwischenschaltet,
> welches mit dem Takt der Quelle arbeitet und das mit einem Enable-Signal
> die Daten übernimmt.
> Danach wird das Enable weggenommen und das Register mit dem anderen Takt
> kann jetzt die Daten irgendwann übernehmen; solange bleibt das Enable
> des ersten Registers aus. Erst wenn das zweite Register die Daten
> übernommen hat, darf das erste Register wieder neue Daten empfangen.

@clupus:

Du findest viel Info, wenn Du nach "Handshake" googelst.

Eine ganz wichtige Grundregel vorweg: Zwischen den zwei Registern, 
welche den Domain-Übergang eingrenzen gehört absolut KEINE Logik (Buffer 
oder Inverter lassen sich vielleicht noch diskutieren). Da muss ein 
einziger direkter Pfad sein, sonst machen Dir die verschiedenen 
Laufzeiten durch die verschiedenen Pfade Probleme (Du speicherst u.U. 
Teilresultate).

Wenn Du Angst vor Metastabilität hast, kannst Du in der Zieldomain 
gleich noch ein zweites Register hinter das Synchronisationsregister 
pflanzen bevor Du das Signal weiter benutzt (soll aber in FPGA's nicht 
so problematisch sein, habe ich in diesem Forum schon gelesen...)

von Christian W. (clupus)


Lesenswert?

Hallo,

nur damit wir vom gleichen Problem reden kurz eine Zusammenfassung des 
bisherigen Designs:
Ich habe einen FPGA mit verschiendener Hardware dran. Um leicht die 
einzelnen Komponenten ansprechen zu können, habe ich für jede 
Hardwarekomponente einen separaten Takt definiert. So will z.B. der ADC 
mit 12 MHz arbeiten während der DAC mit 30 MHz arbeitet. Die Logik der 
hardwarenahen Komponenten ist damit relativ einfach aufzubauen.
Jetzt soll die eigentliche Arbeitslogik im FPGA mit einer höheren 
Frequenz laufen, um Berechnungen ausführen zu können. Ich brauche also 
eine Sampling-Wandlung langsam->schnell und schnell->langsam. DAbei ist 
es mir nicht so sehr wichtig, dass die Werte besodners latenzfrei 
ankommen. Wichtiger wäre es zum einen keine Fehler darin zu haben (ein 
Teil der Daten schon vom neuen Wert, der andere noch vom alten Wert 
aufgrund längerer Laufzeiten). Zum anderen sollte es einigermaßen 
zeitlich definiert ablaufen.

Ich fürchte mit meinen verschiedenen Taken habe ich mir keine Freude 
gemacht, oder?

Wenn ich das richtig verstanden habe muss ich also mittels einer 
Schaltung von zusätzlichen Registern und Logik garantieren, dass die 
Daten gleichzeitig mit dem neuen Takt abgetastet werden, richtig?

Christian

von P. K. (pek)


Lesenswert?

Christian Wolf schrieb:
> Ich fürchte mit meinen verschiedenen Taken habe ich mir keine Freude
> gemacht, oder?
>
Jede Clock-Domain, die Du weniger hast, erleichtert Dir das Leben.

> Wenn ich das richtig verstanden habe muss ich also mittels einer
> Schaltung von zusätzlichen Registern und Logik garantieren, dass die
> Daten gleichzeitig mit dem neuen Takt abgetastet werden, richtig?
Genau. Hier kommt das bereits erwähnte "Handshake" ins Spiel, um zu 
signalisieren, dass z.B. die Daten zur Zeit stabil sind...

von Johannes E. (cpt_nemo)


Lesenswert?

Christian Wolf schrieb:
> Ich fürchte mit meinen verschiedenen Taken habe ich mir keine Freude
> gemacht, oder?

Absolut nicht, das solltest du ändern!

Ideal ist, wenn man sich von allen benötigten Frequenzen ein gemeinsames 
Vielfaches sucht, für 12 und 30 MHz wären z.B. 60 MHz (oder 120 MHz) gut 
geeignet. Aus dem 60 MHz-Takt erzeugst du dir dann die Taktsignale für 
die einzelnen Hardware-Funktionen, aber so, dass alle Register im FPGA 
mit 60 MHz getaktet werden.

> Die Logik der
> hardwarenahen Komponenten ist damit relativ einfach aufzubauen.

Das ist mit einem schnelleren Takt genau so einfach. Du musst einfach 
nur mit einem Zähler einen langsameren Takt generieren, der dann für 
alle Register als "Enable"-Eignal funktioniert; alles andere bleibt 
gleich.

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.