01signal.com

Die richtige Strategie für das I/O-Timing wählen

Diese Seite gehört zu einer Serie von Seiten über Timing. Die vorherigen Seiten haben die Theorie hinter Timing-Berechnungen erklärt, das Schreiben mehrerer Timing-Vorgaben (timing constraints) gezeigt und die Prinzipien des Timing-Closure besprochen. Diese Seite beginnt die Besprechung der I/O-Timing-Vorgaben.

Einführung

Bis zu diesem Punkt bezog sich die gesamte Diskussion über Timing-Vorgaben auf Pfade (paths) innerhalb des FPGAs. Endlich ist es an der Zeit, über die Vorgaben zu sprechen, die das Timing der I/O-Ports des FPGAs steuern.

Bevor wir uns mit den Timing-Vorgaben befassen, müssen die verschiedenen Methoden zur Synchronisierung zwischen dem FPGA und der externen Komponente bekannt sein. Timing-Vorgaben, die ohne Berücksichtigung dieses Themas geschrieben werden, können wertlos sein. Darüber hinaus kann die für die I/O-Schnittstelle verantwortliche Logik ungeeignet geschrieben sein. In extremen Fällen kann auf der Platine die notwendige Verdrahtung fehlen, um ein garantiert funktionierendes I/O zu ermöglichen.

Mit dem nötigen Bewusstsein für die Synchronisierung mit der externen Komponente lassen sich die richtigen Befehle für die Timing-Vorgaben auswählen. Die praktischen Aspekte dafür werden auf der nächsten Seite erklärt.

Auf dieser Seite setze ich voraus, dass Sie mit IOB-Registern (IOB registers) vertraut sind.

Taktverteilung

Solange die Pfade innerhalb des FPGAs lagen, war kein Bewusstsein für den Taktversatz (clock skew) zwischen den beiden Seiten des Pfads nötig: Die Tools waren für die Verteilung des Takts verantwortlich, und die Timing-Berechnungen berücksichtigten den Taktversatz.

Bei den I/O-Timing-Vorgaben ist das anders: Eine Seite des Pfads ist eine externe Komponente außerhalb des FPGAs. Um sich mit den Datensignalen zu synchronisieren, verlässt sich diese Komponente auf einen Takt, den sie an einem ihrer Pins empfängt. Aber womit ist dieser Takt synchronisiert?

Die Strategie ist meist eine dieser beiden:

Diese beiden Strategien werden als Nächstes genauer besprochen. Beim quell-synchronen Takt gibt es einen wesentlichen Unterschied, je nachdem ob die Datensignale Eingänge oder Ausgänge sind. Diese Szenarien werden deshalb getrennt besprochen.

System-synchroner Takt

Die einfachste Methode, mehrere Komponenten auf einer Platine zu synchronisieren, besteht darin, alle Komponenten an einen Takt anzuschließen. Das nennt man system-synchronen Takt (englisch: system synchronous clock) oder gemeinsamen Takt (englisch: common clock).

System synchronous clocking

Der Vorteil dieser Methode ist, dass die Timing-Parameter aller Komponenten relativ zu einem einzigen Taktsignal sind. Für die Timing-Berechnung ist der Takt also auf beiden Seiten derselbe. Für ein Datensignal, das sich zwischen zwei Komponenten auf der Platine ausbreitet, ähnelt die Berechnung daher einem Pfad innerhalb des FPGAs: Der Pfad beginnt mit einer Takt-zu-Ausgang-Verzögerung (clock-to-output delay) relativ zur ersten Taktflanke. Am Ende des Pfads ist die tsu relativ zur zweiten Taktflanke. Der system-synchrone Ansatz bedeutet, dass diese beiden Taktflanken zum selben Takt gehören.

Die Arbeit mit einem system-synchronen Takt ist einfach, aber diese Methode eignet sich nur für relativ niedrige Frequenzen. Zur Erinnerung aus der Einführung in die Timing-Berechnungen: Die minimale Taktperiode ist die Summe mehrerer Timing-Parameter: der Takt-zu-Ausgang-Verzögerung des ersten Flipflops, der Ausbreitungsverzögerung (propagation delay) und der tsu des zweiten Flipflops. Bei einem Ausgangsport ist die Takt-zu-Ausgang-Verzögerung relativ groß, weil es die Zeit ist, die die Leitung auf der Platine braucht, um die erforderliche Spannung zu erreichen. Damit ist es aber nicht getan: Hinzu kommen der Taktversatz (clock skew) und andere Unsicherheiten, die mit dem Takt zusammenhängen. Wenn man alle Zahlen addiert, ist die minimale Taktperiode unter Umständen nicht beeindruckend.

Als Faustregel gilt: Ein system-synchroner Takt ist für I/O mit einer Datenrate über 100 MHz nicht geeignet. Das hängt jedoch stark von den beteiligten Komponenten ab. Tatsächlich haben manche elektronischen Komponenten Timing-Anforderungen, die mit einem system-synchronen Takt selbst bei viel niedrigeren Frequenzen nur sehr schwer zu erfüllen sind. Solche Komponenten sind einer der Gründe, warum es wichtig ist, das I/O-Timing vor der Fertigung der Platine zu planen.

set_input_delay und set_output_delay (auf der nächsten Seite erklärt) sind die am besten geeigneten Timing-Vorgaben für den Einsatz mit einem system-synchronen Takt.

Quell-synchroner Takt

Ziemlich oft basiert die Schnittstelle zwischen zwei Komponenten auf einer Platine auf einem Takt, der von einer dieser Komponenten geliefert wird. Natürlich macht es einen Unterschied, ob der Takt vom FPGA oder von der externen Komponente erzeugt wird.

Es gibt also vier relevante Szenarien:

Asynchrone Eingänge

Manche Eingänge sind keinem Takt zugeordnet. Zum Beispiel sind Taster, I2C, RS232 und diverse Statussignale externer Komponenten nicht mit einem Takt synchronisiert. Diese Signale sind meist viel langsamer als der Takt im FPGA. Die übliche Lösung besteht deshalb darin, diese Signale mit Flipflops abzutasten – vorzugsweise mit IOB-Registern – und mit den üblichen Techniken des Logikdesigns weiterzuarbeiten.

Diese Eingänge sind nicht mit dem Takt synchronisiert, der für die Abtastung verwendet wird. Daher erfüllt das IOB-Register (oder das mit dem Port verbundene Flipflop) die Rolle eines Metastabilitäts-Schutzregisters. Für jeden Port sollte daher ein zweites Register verwendet werden, ähnlich wie bei einem Taktdomänenübergang (clock domain crossing) zwischen unabhängigen Takten (unrelated clocks). Andernfalls besteht die Gefahr von unvorhersehbarem und seltsamem Verhalten, selbst wenn die Eingangssignale langsam sind und das Design im Moment zu funktionieren scheint.

Die Timing-Vorgaben sollten so geschrieben werden, dass ein wiederholbares Verhalten sichergestellt ist: Es gelten dieselben Richtlinien wie für IOB-Register, auch wenn die Flipflops nicht im IOB platziert sind. Zur besonderen Sicherheit empfiehlt es sich, zusätzlich eine gezielte Timing-Vorgabe im Hinblick auf die Rolle dieser Register als Metastabilitäts-Schutzregister zu schreiben (dies wird auf einer anderen Seite erklärt).

False Paths

False Paths (false paths) für I/O-Ports sind im Prinzip dasselbe wie für Pfade innerhalb des FPGAs: Der Befehl set_false_path wird verwendet, um zu verlangen, dass für bestimmte Ports keine Timing-Anforderungen durchgesetzt werden.

False Paths wurden bereits besprochen, was Pfade innerhalb des FPGAs betrifft. Auf derselben Grundlage beruht die Motivation hinter False Paths für I/O-Ports hauptsächlich darauf, eine leere Liste von Pfaden ohne Timing-Vorgabe (unconstrained paths) zu erhalten. Diese Liste sollte leer sein, damit ein Port, dem wegen eines Fehlers eine Timing-Vorgabe fehlt, leichter erkannt wird.

False Paths sollten nur verwendet werden, wenn das Timing des Ports völlig bedeutungslos ist. Zum Beispiel bei LEDs und DIP-Schaltern.

Beispiele für SDC-Vorgaben:

set_false_path -to [get_ports led_0]
set_false_path -from [get_ports dip_switch_0]

Zusammenfassung

Diese Seite hat einige Strategien zum Synchronisieren zwischen FPGA und externer Komponente umrissen. Die gewählte Strategie beeinflusst sowohl das Logikdesign als auch die Timing-Vorgaben.

Mit diesem Wissen ist es an der Zeit zu besprechen, wie die I/O-Timing-Vorgaben geschrieben werden.

Diese Seite wurde maschinell aus dem Englischen übersetzt. Im Zweifelsfall siehe den Originaltext.
Copyright © 2021-2026. All rights reserved. (dcc38493)