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?
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.
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:
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)
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
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.
awjlogan
awjlogan