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?
Aus Wikipedia :
In einer synchronen Schaltung Taktversatz ( ) ist die Differenz der Ankunftszeit zwischen zwei sequentiell benachbarten Registern. Gegeben seien zwei sequentiell benachbarte Register und mit Uhrankunftszeiten an Registeruhrstiften als und bzw. kann dann Taktversatz definiert werden als:
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:
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. .
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:
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_uncertainty
Befehl - warum sollte ich jemals die Schräglage "manuell angeben" wollen?
(*) Eine Ausnahme: asynchrone Systeme .
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
ajs410