Warum sind abgeleitete Latches schlecht?


22

Mein Compiler beschwert sich über abgeleitete Latches in meinen kombinatorischen Schleifen ( always @(*), in Verilog). Mir wurde auch gesagt, dass gefolgerte Latches möglichst vermieden werden sollten.

Was genau ist falsch an abgeleiteten Latches? Sie machen es sicherlich einfacher, kombinatorische Schleifen zu schreiben.


Es wäre gut, ein HDL-Beispiel für
Ihre

Ich habe bemerkt, dass diese Frage in letzter Zeit ein paar Mal zitiert wurde. Wenn Sie kein Experte auf diesem Weg sind, beachten Sie, dass alle Antworten außer denen von Oli Glaser eine Kombination aus falschen und / oder nicht nützlichen sind.
EML

Es ist weniger so, dass abgeleitete Latches vermieden werden sollten, als dass transparente Latches im Allgemeinen vermieden werden sollten, es sei denn, Sie wissen genau, was Sie tun absolut sicher).
Peter Green

Antworten:


20

Ein "Latch" unterscheidet sich von einem "Flip-Flop" darin, dass ein FF seinen Ausgang nur als Reaktion auf eine Taktflanke ändert. Ein Latch kann seine Ausgabe als Reaktion auf etwas anderes als eine Uhr ändern. Zum Beispiel hat ein SR-Latch einen Set- und einen Reset-Eingang und wenn einer von beiden aktiv ist, kann sich der Ausgang ändern. Wobei ein SR-FF nur auf ein Setzen oder Zurücksetzen reagiert, wenn es auch eine Taktflanke gibt.

In einem FPGA soll Ihre Logik vollständig synchron sein. Dies bedeutet, dass alle Speicherelemente (wie z. B. FFs) von einer einzigen Taktquelle getaktet werden. Alles, was asynchron zu dieser Uhr ist, muss sehr sorgfältig behandelt werden, da sonst Zeitsteuerungsfehler auftreten.

Ein Latch ist grundsätzlich ein asynchrones Speicherelement. Es hat keinen Takteingang und kann daher nicht mit einer Uhr synchronisiert werden. Ich sollte beachten, dass es FFs mit asynchronem Reset und Reset-Eingängen gibt, und diese sollten mit der gleichen Sorgfalt wie normale Latches behandelt werden.

Das Eingehen auf alle Zeitprobleme, die Latches verursachen können, geht weit über das hinaus, was hier behandelt werden kann. Lassen Sie mich jedoch ein Beispiel geben:

Angenommen, Sie haben einen SR-Latch und möchten, dass dieser jedes Mal gesetzt wird, wenn ein 8-Bit-Zähler einen bestimmten Wert erreicht. Ich bin nicht sicher, wie der Verilog-Code lauten würde, aber in VHDL lautet der Code: set <= '1' when count = "11010010" else '0'; Das eingestellte Signal geht an den Set-Eingang unseres SR-Latch.

Die Logik, die erzeugt wird, ist rein kombinatorisch; Eine Mischung aus And-Gates, Or-Gates und Invertern (oder LUTs). Aber die Signalwege durch diese kombinatorische Logik sind nicht immer perfekt und das "gesetzte" Signal könnte Störungen aufweisen. Der Signalweg durch eine bestimmte Gruppe von Gattern kann länger dauern als bei einer anderen Gruppe, sodass der eingestellte Ausgang für einen kurzen Moment aktiv wird, bevor der Ausgang in den Endzustand übergeht.

Diese Ausgangsstörung könnte dazu führen, dass unser SR-Latch gesetzt wird, obwohl dies nicht der Fall war. Wenn wir von einem SR-Latch zu einem SR-FF wechseln, der mit demselben Takt wie der Zähler getaktet ist, wartet der SR-FF einen ganzen Taktzyklus, bevor er den Zustand ändert. Im Wesentlichen wartet es darauf, dass sich das eingestellte Signal einstellt, bevor es angezeigt wird.

Wenn die Pfade durch die kombinatorische Logik für das eingestellte Signal nur unterschiedlich geroutet werden (was zu unterschiedlichen Verzögerungen führt), ändert sich auch das Glitch-Verhalten. Die Logik könnte gut funktionieren, aber da Sie etwas völlig Unabhängiges geändert haben, wird diese Logik anders geroutet, und der Fehler tritt auf. Temperatur und Spannung ändern auch das Signal-Timing und können somit das Störimpulsverhalten ändern.

Dies ist unsicher im Timing, weshalb Sie Latches in Ihrer Logik vermeiden sollten. FFs sind viel sicherer zu bedienen. Dies ist der Grund, warum Ihr Compiler Sie vor Latches warnt, da es leicht ist, fälschlicherweise ein Latch zu erstellen, und Sie es wahrscheinlich sowieso nicht wollen.

Natürlich sind manchmal Verriegelungen erforderlich. Sie müssen sie nur sehr selten verwenden, nur wenn dies unbedingt erforderlich ist, und dann müssen Sie die Logik richtig entwerfen, damit keine Störungen möglich sind.


Ich würde erwarten, dass, wenn man ein Latch explizit in Verilog oder einer anderen Sprache spezifiziert und eine Schaltung so entwirft, dass sie mit jeder Kombination kombinatorischer Verzögerungen, die das Latch speisen, korrekt funktioniert (was auch immer die Signale erzeugt, für die es kombiniert werden würde) Der Latch würde dies so tun, dass selbst bei den ungünstigsten Kombinationen von Null-Verzögerungs-Logikpfaden und Maximal-Verzögerungs-Logikpfaden die Timing-Anforderungen für die Latches noch erfüllt wären. Ein Synthesizer sollte eine Arbeitsschaltung erzeugen wobei der Zwischenspeicher selbst eine nicht negative Verzögerung aufweist. Wenn jedoch ...
Supercat

... verwendet man kombinatorische Logik und Rückkopplung, ohne Knoten anzugeben, die eine nicht negative Verzögerung haben müssen, so gut wie alles kann passieren. Ich weiß, dass synchrone Logik einfacher zu entwerfen ist als asynchrone, aber viele Geräte müssen Uhren im Ruhezustand herunterfahren, um Strom zu sparen, ohne völlig tot zu sein. Es könnte interessant sein, ein Gerät zu haben, das vollkommen synchron ist, aber jedem Pin ein paar logische Ausgänge für "Laufen, wenn der Pin hoch ist" und "Laufen, wenn der Pin niedrig ist" zugeordnet hat, zusammen mit der Fähigkeit, einen Takt zu erzeugen, wenn Jeder Pin, der angezeigt wird, dass einer benötigt wird.
Supercat

Eine solche Fähigkeit würde den Bedarf an asynchroner Logik erheblich verringern, da ein Eingang, der im Ruhezustand des Geräts eingegangen ist, den internen Oszillator und die Schaltung gerade lange genug einschalten könnte, damit der Eingang verarbeitet und bestätigt werden kann. Ein solches Merkmal wäre viel vielseitiger als das Vorhandensein eines einzelnen "Wake-up" -Pins, aber Single-Wake-up-Designs scheinen die Norm zu sein. Würde ein Multi-Wake-up-Ansatz, wie ich ihn beschrieben habe, überschüssiges Silizium verbrauchen? Ich würde denken, dass der Siliziumbedarf im Vergleich zu allem anderen auf dem Chip ziemlich gering wäre.
Supercat

13

Was macht eine gefolgerte Klinke aus?
Für die kombinatorische Logik ist der Ausgang der Schaltung nur eine Funktion des Eingangs und sollte keinen Speicher oder internen Zustand (Latch) enthalten.

In Verilog behält eine Variable ihren vorherigen Wert bei, wenn ihr in einem Always- Block kein Wert zugewiesen wird . Es muss ein Latch erstellt werden, um diesen aktuellen Wert zu speichern.

Eine unvollständige if-else- Anweisung generiert Latches. Eine if-else- Anweisung wird als "unvollständig" betrachtet, wenn der Ausgabezustand nicht für alle möglichen Eingabebedingungen definiert ist. Gleiches gilt für eine unvollständige case- Anweisung oder eine case- Anweisung ohne default: item.

Warum sind abgeleitete Latches schlecht?
Abgeleitete Latches können als "Warnsignal" dafür dienen, dass der Logikentwurf möglicherweise nicht wie beabsichtigt implementiert wird. Eine entscheidende if-else oder Fall Aussage könnte vom Design fehlen.

Latches können zu Zeitproblemen und Rennbedingungen führen. Sie können zu einer kombinatorischen Rückkopplung führen - Rückführung des Ausgangs zum Eingang - was unvorhersehbar sein kann.

So vermeiden Sie das Erstellen abgeleiteter Latches:

  • Schließen Sie alle Zweige einer if- oder case- Anweisung ein
  • Weisen Sie jedem Ausgangssignal in jedem Zweig einen Wert zu
  • Verwenden Sie zu Beginn des Vorgangs die Standardzuweisungen, damit jedes Signal zugewiesen wird.

Einige Teile aus "FPGA Prototyping by Verilog Examples" von P. Chu


2
"FPGA-Prototyping anhand von Verilog-Beispielen" ist ein gutes Buch zum Erlernen des praktischen Verilog für die Synthese. Es enthält einige gute Beispieldesigns, von einfachen kombinatorischen bis hin zu einfachen sequentiellen Designs, die nützliche Designs wie UART, VGA, Softcore-Prozessor (Picoblaze) und sogar ein Pong-Spiel hervorbringen. Es umfasst auch grundlegende Testbench und Simulation. @Randomblue, du solltest dir eine Kopie schnappen, wenn du sie noch nicht hast. Ich glaube, er hat auch eine VHDL-Version gemacht.
Oli Glaser

8

Latches sind in FPGAs oder CPLDs sehr schwierig zu verwenden, daher meiden viele Leute sie einfach vollständig. Einer der Gründe ist, dass viele FPGAs kein eingebautes Latch haben und daher aus logischen Gattern bestehen - dies kann zu unangenehmen Timing-Problemen führen.
Außerdem haben Sie keine Kontrolle über Zeitverzögerungen und Rennbedingungen, wenn Sie ein Latch verwenden (es sei denn, es gibt ein natives Element).

Ich würde davon abraten, Latches zu verwenden, es sei denn, Sie können absolut nicht darauf verzichten (z. B. Ausleihen von Zeit, um eine erforderliche maximale Taktfrequenz zu erreichen), und Codierungstechniken verwenden, um versehentlich auf Latches zu schließen.


6

Sequentielle Logikentwürfe, die unter Verwendung kombinatorischer Logik und Rückkopplung erstellt wurden, gehen im Allgemeinen von einer Annahme aus, die bei Verwendung physikalischer Gatter sinnvoll erscheint: Die Ausgabe eines Gatters ändert sich erst, wenn sich die Eingabe tatsächlich geändert hat. Es gibt einige Fälle, in denen diese Annahme möglicherweise nicht zutrifft, wenn echte Gatter verwendet werden (z. B. wenn ein schnelles NOR-Gatter und ein schneller Inverter durch ein Signal angesteuert werden, das langsam von VSS nach VDD ansteigt, und wenn der Inverter während des NOR-Vorgangs auf 1,2 Volt schaltet Gate schaltet erst bei 1,7 Volt. Beim NOR-Gate wird der Ausgang des Wechselrichters möglicherweise auf Low geschaltet, bevor das langsam ansteigende Signal auf High geschaltet wird. Solche Probleme können jedoch im Allgemeinen durch Hinzufügen eines Puffers bei langsamen Änderungen behoben werden Das Signal wird an mehr als ein Ziel geleitet. Unglücklicherweise,

Das Problem besteht darin, dass ein FPGA-Compiler, sofern nicht ausdrücklich anders angegeben, eine kombinatorische Schaltung willkürlich durch eine völlig andere Schaltung ersetzen kann, die das gleiche Verhalten im eingeschwungenen Zustand aufweist, jedoch ein völlig anderes Timing aufweist. Nehmen wir zum Beispiel an, eine komplexe kombinatorische Funktion F nimmt sechs Eingänge U bis Z an. F wird direkt der Schaltung P zugeführt, und (F NAND Z) wird der Schaltung Q zugeführt. Der Compiler erkennt möglicherweise, dass der an Q zugeführte Wert nur davon abhängt F, wenn Z hoch ist, und kann eine Funktion F 'berechnen, die wie F ist, außer dass Z als hoch angenommen wird; Q kann dann mit (F 'NAND Z) anstatt mit (F NAND Z) gespeist werden. Es wäre durchaus möglich, dass die effizienteste Realisierung von P fünf Gate-Verzögerungen hätte, aber die effizienteste Realisierung von Q hätte nur zwei. Somit,

Wenn eine Schaltung kombinatorische Rückkopplungsschleifen hat, muss ein FPGA-Compiler physikalische Signalknoten hinzufügen, die physikalisch eine positive Verzögerung haben (eine Null-Verzögerungs-Rückkopplungsschleife kann in der realen Welt nicht existieren), aber es gibt keine Garantie dafür Solche Knoten würden an den Stellen hinzugefügt, die notwendig sind, damit sich die Schaltung wie gewünscht verhält. Es gibt auch keine Garantie dafür, dass eine geringfügige Änderung des Designs nicht dazu führt, dass der Compiler von einer willkürlichen Platzierung, die in der realen Welt funktioniert, zu einer anderen willkürlichen Platzierung wechselt, die zufällig fehlschlägt.


0

In diesem Link wird kurz erläutert, wie Sie eine Verriegelung im Design schließen können.

https://www.doulos.com/knowhow/fpga/latches/


1
Willkommen bei EE.SE! Sie können Ihre Antwort verbessern, indem Sie einige relevante Details aus dem Link einfügen. Dies stellt sicher, dass Ihre Antwort eine hohe Qualität hat, auch wenn die Originalseite verschwindet.
David
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.