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.
Antworten:
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.
quelle
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:
Einige Teile aus "FPGA Prototyping by Verilog Examples" von P. Chu
quelle
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.
quelle
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.
quelle
In diesem Link wird kurz erläutert, wie Sie eine Verriegelung im Design schließen können.
https://www.doulos.com/knowhow/fpga/latches/
quelle