Ist es empfehlenswert, beim digitalen Design immer den Anfangswert zuzuweisen und Signale zurückzusetzen?

Ich habe gelesen, dass Anfangswerte für ein Signal in einem FPGA eingestellt werden können, da das Design nach dem Einschalten "darin geladen" wird. Bei ASICs können wir uns jedoch nur auf ein Reset-Signal verlassen, um alle Signale in einen bekannten Zustand zu versetzen. Ist es also eine gute Praxis, allen Signalen im Code, die synthetisiert werden sollen, einen Anfangswert zuzuweisen?

Ich habe auch gelesen, dass Reset-Signale die Routing-Ressourcen in FPGA stark in Anspruch nehmen und auch in ASIC überall geroutet werden müssen. In FPGAs ist die Nichtverwendung von Reset in jedem einzelnen Register eine Möglichkeit, die Verwendung von Routing-Ressourcen zu reduzieren, aber ich bin mir nicht sicher, welchen Vorteil dies in ASICs hat. Ist es eine gute Praxis, Wege zu finden, um die Verwendung des Rücksetzsignals im synchronen Design zu reduzieren, indem es in einigen Teilen des Designs nicht, aber in anderen verwendet wird?

Antworten (5)

Ich würde sagen, dass es ein paar verschiedene Möglichkeiten gibt, wie man das argumentieren könnte. Ich bin mir nicht sicher, was im Allgemeinen die "beste" Methode ist, es hängt davon ab, was Sie erreichen möchten. Es ist einfach, alles auf dem FPGA in HDL zu initialisieren, sodass alles mit einem bekannten Zustand beginnt, wenn es aus der Konfigurationsroutine kommt. Aufgrund unterschiedlicher Taktkonfigurationen sind jedoch in der Regel auch auf einem FPGA Resets erforderlich. In diesem Fall kann es sinnvoller sein, die Dinge NICHT zu initialisieren, da dann die X-Propagation in der Simulation überprüft werden kann, um sicherzustellen, dass die Resets ihre Aufgabe ordnungsgemäß erfüllen, indem die entsprechenden Register zurückgesetzt werden.

In Bezug auf das Routing ist es sinnvoll, herauszufinden, was TATSÄCHLICH zurückgesetzt werden muss, und dann das Zurücksetzen von Dingen zu unterlassen, bei denen die anfängliche Konfiguration keine Rolle spielt. Dies spart Routing-Ressourcen sowohl auf FPGAs als auch auf ASICs. Zum Beispiel müssen Dinge wie Datenbusse mit gültigen Signalen NICHTS des Datenbusses zurückgesetzt werden, sondern nur die gültigen Signale. Wenn Ihr Datenbus 32 oder 64 Bit breit ist, wird nur das Zurücksetzen der gültigen Signale die Komplexität der Rücksetzschaltung erheblich reduzieren. Die reduzierte Routing-Komplexität kann zu einer geringeren Ressourcennutzung und einem einfacheren Timing-Closure führen. Es ermöglicht dem Synthesizer auch, die Reset-Eingänge der Flip-Flops für andere Zwecke zu verwenden, was die Logik vereinfachen und wiederum die Fläche und das Timing verbessern könnte.

Auch was Sie zurücksetzen und wie Sie es tun (synchronisieren vs. asynchronisieren, auf 0 zurücksetzen vs. auf ungleich Null zurücksetzen) kann sich darauf auswirken, wie der Synthesizer auf Dinge wie RAMs schließen kann. Pipeline-Register im Block-RAM verfügen nicht unbedingt über Reset- oder Vorladefunktionen. Wenn also Ihre Reset-Logik mit den Fähigkeiten des Block-RAM auf Ihrem Zielchip in Konflikt steht, werden Ihre Pipeline-Register nicht zusammengeführt und Ihre Timing-Leistung und Ressourcennutzung wird leiden.

X für Simulation, nicht für Synthese. Die Konfigurationszeit ist die einzige Zeit, in der das Verhalten garantiert ist, also sollten Sie diese verwenden. +1 für lokale Resets: xilinx.com/support/documentation/white_papers/wp272.pdf
Sollte hinzugefügt werden, wird dies von Ihrem Synthesetool garantiert, nicht vom HDL-Code selbst.

Für keine der Technologien (FPGA oder ASIC) sollten Sie sich auf die Signalinitialisierung verlassen. Wenn Sie brauchen, dass Ihre Gates und Signale in einem bekannten Zustand starten, verwenden Sie Resets .

Ich habe gelesen, dass Anfangswerte für ein Signal in einem FPGA eingestellt werden können, da das Design nach dem Einschalten "darin geladen" wird.

Nicht unbedingt. Es ist keine Funktion des VHDL-Standards selbst und hängt daher vom Synthesizer/FPGA ab. Die FPGAs von Xilinx und Altera unterstützen dies, aber es ist nicht von der Branche vorgegeben. Sie sollten sich also darüber im Klaren sein, dass Designs, die auf Initialisierungen angewiesen sind, die Portabilität bis zu einem gewissen Grad beeinträchtigen.

Tatsächlich stellt Pedroni in Circuit Design with VHDL fest , dass „der Anfangswert [von Signalen] nicht synthetisierbar ist, sondern nur in Simulationen berücksichtigt wird“. siehe Abschnitt 7.2

Darüber hinaus sollten die Initialisierungen, die tatsächlich in Fabric-Konfigurationen realisiert werden, als asynchron betrachtet werden und (je nach Design) zu Timing-Verletzungen führen. Als Referenz siehe Seite 89 von Xilinx UG470 - 7 Series FPGAs Configuration , wo das Dokument den Startsequenzer behandelt. Siehe insbesondere Anmerkung 3:

  • GWE wird synchron zum Konfigurationstakt (CCLK) geltend gemacht und hat einen signifikanten Versatz über den Teil. Daher werden sequentielle Elemente nicht synchron zur Systemuhr des Benutzers freigegeben und es kann während des Starts zu Timing-Verletzungen kommen. Es wird empfohlen, das Design nach dem Start zurückzusetzen und/oder eine andere Synchronisationstechnik anzuwenden.

Bei ASICs können wir uns jedoch nur auf ein Reset-Signal verlassen, um alle Signale in einen bekannten Zustand zu versetzen.

Das ist genau. Sollte Ihr Design jemals auf die ASIC-Fertigung portiert werden, müssen Sie viel nacharbeiten, wenn Ihr Design keine Zurücksetzungen verwendet.

Ist es eine gute Praxis, Wege zu finden, um die Verwendung des Rücksetzsignals im synchronen Design zu reduzieren, indem es in einigen Teilen des Designs nicht, aber in anderen verwendet wird?

Ich würde argumentieren, dass dies eine schlechte Praxis darstellen würde. Eine gute Praxis wäre es, immer Resets in Ihre Module zu entwerfen. Wenn Sie entscheiden, dass Sie sie nicht implementieren müssen, verbinden Sie sie nicht und sie werden nicht verwendet - aber wenn Sie später feststellen, dass Ihre nicht verbundenen Resets die Quelle des Fehlers sind, nach dem Sie gesucht haben (nicht ein weit hergeholtes Szenario), wird es trivial sein, sie miteinander zu verbinden.

Abschließend möchte ich darauf hinweisen, dass das Entwerfen aller Ihrer Resets (anstelle von Initialisierungen) Soft-Resets ausschließt! Wie können Sie bei Soft-Resets ohne ein gutes Reset-Modell standardmäßig in Ihren Startzustand zurückkehren? (du nicht)

Ich bevorzuge Async Assert, Sync Negate Resets in meinem HDL; Es stellt sicher, dass sich der Chip in einem bekannten Zustand befindet, auch wenn die Uhr nicht vorhanden ist, aber auch, dass das Gerät sauber aus dem Reset herauskommt. Dies ist in Altera-Geräten einfach zu erreichen, indem sowohl clk als auch rst in der Sensitivitätsliste stehen und ein Konstrukt wie if rst = '1' then ... else if riseing_edge(clk) then ... end if;
@akohlsmith fair genug. Ich wollte nicht synchronisieren über asynchronisieren. Ich werde das bearbeiten.
Die Idee ist, dass einige Blöcke des Designs zurückgesetzt werden sollen, aber einige Zwischenblöcke möglicherweise nicht und sie in einen "bekannten Zustand" eintreten, bevor das Design tatsächlich beginnt, sie zu verwenden. zB Pipeline-Verarbeitungsblöcke.
@ quantum231 Und das könnte gut funktionieren. Sie kennen Ihr Projekt am besten. Ich habe dies in Bezug auf Best Practices und Empfehlungen von Xilinx geschrieben. Denken Sie auch an die mögliche Notwendigkeit von Soft-Resets. Und beachten Sie, dass es eine gute Idee ist, Code so zu schreiben, als ob Sie ihn in zukünftigen Anwendungen wiederverwenden möchten (dh wo Sie die Reset-Leitung tatsächlich benötigen).

Analogie: Ist es für Spieleentwickler eine gute Praxis, den Status des Spiels zu initiieren, wenn ein Benutzer es spielt? Benutzer 1: „Wow, ich habe das Spiel gegen Ende angefangen und beendet … ähm … kay“, Benutzer 2: „Ich habe am Anfang angefangen und hatte ein ganzes Spiel zu spielen, schön!“.

In diesem Fall ist es sehr wichtig , weil es sehr wichtig ist.

Wenn Sie mit digitalen Filtern arbeiten, spielt es keine Rolle, womit Sie die Register initialisieren , weil es sowieso Mist ist.

In diesem Fall ist es nicht wichtig .

Mit anderen Worten, es hängt davon ab, was Sie tatsächlich tun. Wenn Sie ein Menüsystem oder einige endliche Zustandsautomaten haben, ist dies normalerweise sehr wichtig. Es liegt zu 100% an Ihnen oder den Fehlern, die Sie erhalten (ich weiß, dass Quartus einige Fehler ausgeben kann, wenn Sie Signale nicht richtig initiieren).

Ich würde empfehlen, dass Sie immer einleiten, wenn das System zurückgesetzt wird. Das ist meiner Meinung nach ein gutes Design . Ich würde es hassen, auf "Zurücksetzen" zu drücken, das nichts bewirkt, wenn/falls ein System abgestürzt ist.

Wenn ich sehe, dass viele der Routing-Ressourcen nur zum Initiieren von Zuständen dienen, würde ich ein FPGA mit mehr Ressourcen erwerben, aber das ist nur meine persönliche Meinung dazu. Aber am Ende liegt es an Ihnen und Ihrem zukünftigen Unternehmen und wie Sie es nutzen werden. Wenn Sie Ihre Verwendung genauer beschreiben würden, wäre meine Antwort nicht so allgemein gewesen.


Hätten Sie etwas mehr in diese Richtung präsentiert:

Ich kann jeden Zustand meines Menüs auf meinem FPGA initiieren, wenn ich ein FPGA mit mehr Ressourcen kaufe, kostet dies 10 Dollar mehr pro Einheit, ich werde 1000 davon verkaufen. Das sind also 10.000 Dollar, eine relativ große Geldsumme.

Oder Sie initiieren nicht jeden Zustand des Menüs und jedes Mal, wenn jemand das Menü öffnet, erscheinen zufällige Auswahlmöglichkeiten und Sie müssen kein weiteres FPGA kaufen. Sie sparen relativ viel Geld .

"Was soll ich tun?", dann würde ich sagen, aktualisieren Sie Ihr FPGA, denn jeder, der Ihr Gerät verwendet, wird für die nächste von Ihnen verkaufte Version nicht wiederkommen. Sie können also jetzt viel Geld verdienen, verlieren aber 99% Ihrer Kunden.


Ich sage "FPGA" überall als Synonym für FPGA und ASIC, die Probleme sind ähnlich, wenn nicht identisch.

Toller Beitrag und alle haben hier tolle Antworten gegeben. Ein Sync/Async-Reset zum Initialisieren von Werten ist sicherheitshalber beim Einschalten immer vorgesehen. Dies gilt insbesondere im Fall von ASICs. Deshalb starten alle Prozessoren, Controller, mit einem Power-On-Reset. Sie bieten auch eine Möglichkeit, das System an jedem Betriebspunkt in seinen Ausgangszustand zu versetzen. Im Falle von FPGAs synthetisieren die meisten Synthesizer jetzt Anfangswerte, auch wenn kein Reset vorhanden ist. Wenn in Altera ein Async-Reset-Signal vorhanden ist, ist der Synthesizer intelligent, um es zu finden und die Werte entsprechend zu initialisieren (nicht im Falle eines Sync-Resets). Wenn sowohl der Reset-Block als auch die Anfangswerte angegeben sind, zeigt altera eine Warnung an, wenn zwischen den zurückgesetzten Werten und den Anfangswerten eine Diskrepanz besteht. Schließlich Routing-Ressourcen , Leistung und Leistung des gesamten Designs hängen davon ab, ob Ihr Reset synchron oder asynchron ist. Sie finden es hier:http://only-vlsi.blogspot.in/2009/05/synchronous-reset-vs-asynchronous-reset.html?m=1

Ich verwende immer synchrones Zurücksetzen. Ich habe eine starke Abneigung gegen alles Asynchrone, stimmen Sie diesem Ansatz zu? Der Reset wird mit der steigenden Taktflanke wirksam.
Normalerweise verwende ich asynchrones Zurücksetzen auf FPGA wegen seiner Geschwindigkeit und hohen Priorität gegenüber dem Takt. Wenn Sie die Synchronisierung zurückgesetzt haben, legen Sie ein weiteres Signal in die Timing-Pfade und reduzieren die Leistung. Andererseits ist Async-Reset anfällig für Metastabilitätsprobleme in ASICs. In FPGAs wird dies automatisch vom Synthesizer behoben, indem zusätzliche Logik hinzugefügt wird. Bei ASICs müssen wir uns darum kümmern. Wenn Sie diesen Beitrag lesen, heißt es, dass in ASICs Sync-Assertion und synchrone De-Assertion das beste Ergebnis liefern.

Pedroni wäre im Zusammenhang mit SRAM-basierten FPGAs falsch, im Zusammenhang mit ASIC wäre er richtig. Wenn Sie jedoch Harry Svensson zuhören, „FPGA überall als Synonym für FPGA und ASIC, die Probleme sind ähnlich, wenn nicht identisch“, dann liegt er jetzt nachweislich falsch.

Best Practice ist es, Ihre Zielarchitektur zu verstehen, die längerfristige Nutzung des von Ihnen geschriebenen Codes zu verstehen und zu verstehen, was der Synthesizer und der Konfigurationsprozess (im Fall von FPGA) mit Ihrer RTL implementieren werden. Schreiben Sie für Ihre Anwendung geeigneten Code.