Was ist Taktversatz und warum kann er negativ sein?

Mein HDL-Compiler (Quartus II) generiert Timing-Berichte. Darin haben die Knoten die Spalte "Clock Skew". Die einzige Definition von Clock Skew, die ich gefunden habe, ist in der TimeQuest-Dokumentation (siehe Seite 7-24):

Verwenden Sie den Befehl, um die Taktunsicherheit oder den Zeitversatz für Takt-zu-Takt-Übertragungen manuell anzugeben set_clock_uncertainty.

Wenn also der Zeitversatz "Unsicherheit" ist, warum sind einige meiner Zeitversätze negativ (z. B. -0,048)? Was genau ist Clock Skew?

Antworten (3)

Aus Wikipedia :

In einer synchronen Schaltung Taktversatz ( T S k e w ) ist die Differenz der Ankunftszeit zwischen zwei sequentiell benachbarten Registern. Gegeben seien zwei sequentiell benachbarte Register R ich und R j mit Uhrankunftszeiten an Registeruhrstiften als T C ich und T C j bzw. kann dann Taktversatz definiert werden als:

T S k e w ich , j = T C ich T C j

Clock Skew kann positiv oder negativ sein. Wenn die Taktsignale vollständig synchron sind, dann ist der an diesen Registern beobachtete Taktversatz Null.

Die Größe des Taktversatzes bei einem Register ist also relativ zu einem anderen Register. Da es relativ ist, kann es positiv oder negativ sein.

Einige Illustrationen:

positive/negative Schräglage führende/hintere Schräglage

Nehmen wir zum Beispiel eine Intraclock-Übertragung, wie sie in dem von Ihnen bereitgestellten TimeQuest-Dokument definiert ist:

Intraclock-Transfers treten auf, wenn der Register-zu-Register-Transfer im Kern des Geräts stattfindet und die Quell- und Zieltakte vom selben PLL-Ausgangspin oder Taktport kommen.

Wenn also das Zielregister physisch näher an der Takterzeugungsschaltung liegt, dann wird der Takt wahrscheinlich am Zielregister ankommen, bevor er am Quellregister ankommt, was zu einem führenden Taktversatz führt, der tatsächlich positiv ist. Wenn das Zielregister die Taktflanke nach dem Quellregister empfangen würde, wäre der Taktversatz nacheilend oder negativ.

Anders gesagt, Taktversatz ist die Ungewissheit darüber, wie eng zeitlich zusammen eine Taktflanke zwei getrennte Register erreichen wird, die in Zeiteinheiten in Bezug auf ein Quellregister in einer Register-zu-Register-Übertragung angegeben sind.

Das Erweitern dieser Definition auf Interclock -Transfers und Setup-and-Hold-Zeiten wird etwas chaotisch. Daher ist es wahrscheinlich einfacher, sich vorzustellen, "wie synchron" eine Flanke oder eine Haltezeit zwischen zwei Registern ist. Wir neigen dazu, unter „synchron“ „gleichzeitig“ zu denken. Aber die Dinge passieren selten absolut genau zur gleichen Zeit. Also müssen wir diese Zeit tolerieren. Und Toleranzen werden oft positiv und negativ (dh ±) angegeben.

Moderne digitale Logikbausteine ​​werden normalerweise(*) mit "synchroner Designpraxis" entworfen: einem global synchronen flankengetriggerten Registertransfer-Designstil (RTL): Alle sequentiellen Schaltungen werden in flankengetriggerte Register aufgeteilt, die mit dem globalen Taktsignal CLK verbunden sind und reine Kombinationslogik.

Dieser Designstil ermöglicht es Menschen, schnell digitale Logiksysteme ohne Rücksicht auf das Timing zu entwerfen. Ihr System wird "einfach funktionieren", solange von einer Taktflanke zur nächsten genügend Zeit bleibt, damit sich der interne Zustand einpendeln kann.

Bei diesem Designstil sind Taktversatz und andere Timing-bezogene Probleme irrelevant, außer um herauszufinden, „Was ist die maximale Taktrate für dieses System?“.

Was genau ist Clock Skew?

Zum Beispiel:

...
     R1 - register 1              R3
     +-+                  
   ->| |------>( combinational  )  +-+
...->| |------>(         logic  )->| |--...
   ->|^|------>(                )->|^|
     +-+       (                )  +-+
      |   +--->(                )   |
     CLK  | +->(                )  CLK
          | |
     R2:  | |
     +-+  | |               
...->| |->+ |
   ->|^|->--+
     +-+
      |
     CLK

In echter Hardware schaltet das "CLK"-Signal nie wirklich genau gleichzeitig bei jedem Register. Der Taktversatz Tskew ist die Verzögerung des Downstream-Takts relativ zum Upstream-Takt ( a ):

Tskew(source, destination) = destination_time - source_time

wobei source_time die Zeit einer aktiven Taktflanke am vorgeschalteten Quellregister (in diesem Fall R1 oder R2) ist und destination_time die Zeit "derselben" aktiven Taktflanke an einem nachgeschalteten Zielregister (in diesem Fall R3) ist. .

  • negativer Taktversatz: Der CLK an R3 schaltet vor dem Takt an R1.
  • Positiver Taktversatz: Der CLK an R3 schaltet nach dem Takt an R1.

Was ist die Auswirkung von Taktversatz?

(Vielleicht würde ein Zeitdiagramm hier dies klarer machen)

Damit die Dinge auch im schlimmsten Fall ordnungsgemäß funktionieren, dürfen sich die Eingänge von R3 während der Setup-Zeit oder Haltezeit von R3 nicht ändern. Schlimmer noch, damit die Dinge richtig funktionieren, müssen wir die Dinge so gestalten, dass:

Tskew(R1, R3) < Tco - Th.

Tclk_min = Tco + Tcalc + Tsu – Tskew(R1, R3).

wo:

  • Tcalc ist die maximale Einschwingzeit im schlimmsten Fall eines beliebigen Blocks der kombinatorischen Logik irgendwo im System. (Manchmal können wir den Block der kombinatorischen Logik, der sich auf dem kritischen Pfad befindet, neu entwerfen, indem wir Teile stromaufwärts oder stromabwärts verschieben oder eine weitere Stufe des Pipelining einfügen, sodass das neue Design eine kleinere Tcalc hat, wodurch wir die Taktrate erhöhen können.) .
  • Tclk_min ist die minimale Zeitspanne von einer aktiven Taktflanke bis zur nächsten aktiven Taktflanke. Wir berechnen es aus der obigen Gleichung.
  • Tsu ist die Registereinrichtungszeit. Der Registerhersteller erwartet, dass wir eine Uhr verwenden, die langsam genug ist, um diese Anforderung immer zu erfüllen.
  • Th ist die Registerhaltezeit. Der Registerhersteller erwartet von uns, dass wir den Taktversatz ausreichend kontrollieren, um diese Anforderung immer zu erfüllen.
  • Tco ist die Clock-to-Output-Verzögerung (Laufzeit). Nach jeder aktiven Taktflanke treiben R1 und R2 die alten Werte für eine kurze Zeit Tco weiter in die kombinatorische Logik, bevor sie auf die neuen Werte umschalten. Dies wird von der Hardware festgelegt und vom Hersteller garantiert, aber nur solange wir die Tsu und Th und andere Anforderungen erfüllen, die der Hersteller für den normalen Betrieb angibt.

Zu viel positive Schiefe ist eine absolute Katastrophe. Zu viel positiver Versatz kann (bei einigen Datenkombinationen) zu "Schleichpfaden" führen, so dass statt R3 die "korrekten Daten" bei Takt N + 1 zwischenspeichern (eine deterministische Funktion der Daten, die zuvor bei Takt N in R1 und R2 zwischengespeichert wurden) , können die neuen Daten, die bei Takt N+1 in R1 und R2 zwischengespeichert werden, durchsickern, die kombinatorische Logik stören und bewirken, dass falsche Daten bei "derselben" Taktflanke N+1 in R3 zwischengespeichert werden.

Jede negative Verzerrung kann durch Verlangsamen der Taktrate "korrigiert" werden. Es ist nur "schlecht" in dem Sinne, dass es uns zwingt, das System mit einer langsameren Taktrate laufen zu lassen, um den Eingängen von R3 Zeit zu geben, sich zu beruhigen, nachdem R1 und R2 neue Daten an der Taktflanke N und später R3 zwischengespeichert haben speichert das Ergebnis bei "der nächsten" Taktflanke N+1.

Viele Systeme verwenden ein Taktverteilungsnetzwerk, das versucht, den Zeitversatz auf Null zu reduzieren. Entgegen der Intuition ist es durch sorgfältiges Hinzufügen von Verzögerungen entlang des Taktpfads – dem Pfad vom Taktgenerator zum CLK-Eingang jedes Registers – möglich, die scheinbare Geschwindigkeit zu erhöhen, mit der sich die Taktflanken-Wellenfront physisch vom CLK-Eingang eines Registers zum CLK bewegt CLK-Eingang des nächsten Registers schneller als die Lichtgeschwindigkeit.

Die Altera-Dokumentation erwähnt

„Vermeiden Sie die Verwendung von kombinatorischer Logik in Taktpfaden, da dies zur Taktverschiebung beiträgt.“

Dies bezieht sich auf die Tatsache, dass viele Leute HDL schreiben, das auf eine Weise auf einem FPGA kompiliert wird, die irgendwie bewirkt, dass etwas anderes als das globale CLK-Signal den lokalen CLK-Eingang einiger Register ansteuert. (Dies kann eine „Clock-Gating“-Logik sein, sodass neue Werte nur dann in ein Register geladen werden, wenn bestimmte Bedingungen erfüllt sind; oder eine „Clock-Divider“-Logik, die nur 1 von N Takten durchlässt, oder so weiter). Dieser lokale CLK wird normalerweise irgendwie vom globalen CLK abgeleitet - der globale CLK tickt, und dann ändert sich entweder der lokale CLK nicht oder (eine kurze Verzögerung nach dem globalen CLK, damit sich das Signal durch dieses "etwas andere" ausbreitet) der lokale CLK ändert sich einmal.

Wenn dieses „etwas andere“ den CLK des Downstream-Registers (R3) antreibt, macht es den Versatz positiver. Wenn dieses "etwas andere" den CLK des Upstream-Registers (R1 oder R2) antreibt, macht es die Verzerrung negativer. Gelegentlich haben alle, die den CLK des Upstream-Registers ansteuern, und alle, die den CLK des Downstream-Registers ansteuern, praktisch die gleiche Verzögerung, wodurch der Versatz zwischen ihnen praktisch Null wird.

Das Taktverteilungsnetzwerk in einigen ASICs ist absichtlich mit kleinen Mengen an positivem Taktversatz in einigen Registern ausgelegt, was der vorgeschalteten kombinatorischen Logik etwas mehr Zeit zum Einschwingen gibt und so das gesamte System mit einer schnelleren Taktrate betrieben werden kann. Dies wird „Clock-Skew-Optimierung“ oder „Clock-Skew-Scheduling“ genannt und bezieht sich auf „ Retiming “.

Ich bin immer noch verwirrt über den set_clock_uncertaintyBefehl - warum sollte ich jemals die Schräglage "manuell angeben" wollen?

(*) Eine Ausnahme: asynchrone Systeme .

Ich glaube, dass die Idee hinter dem Hinzufügen einer Verzögerung zur Minimierung des Taktversatzes manchmal darin bestehen kann, den Takt um fast einen vollen Zyklus zu verzögern. Sobald die Uhr läuft, können Sie sie so einrichten, dass das Flip-Flop A die Taktflanke 1 genau zur gleichen Zeit sieht, zu der Flip-Flop B die Taktflanke 2 sieht. Aus externer Sicht sind dies unterschiedliche Flanken, die Schaltung jedoch nicht Es ist egal, solange die Kanten perfekt ausgerichtet sind.

Clock Skew ist, wenn die Uhr aufgrund der Entfernung, Kapazität usw. zu unterschiedlichen Zeiten an verschiedenen Punkten der Schaltung ankommt, was zu Fehlfunktionen führen kann. Ich denke, das Negative muss sein, wenn die Uhr diesen Punkt erreicht, bevor sie die Referenz erreicht