Warum können Verzögerungen in Verilog nicht synthetisiert werden?

Ich habe immer gelesen, dass im RTL-Code deklarierte Verzögerungen niemals synthetisiert werden können. Sie sind nur für Simulationszwecke gedacht und moderne Synthesewerkzeuge ignorieren Verzögerungsdeklarationen im Code einfach.

Zum Beispiel: x = #10 y;wird x = y;vom Synthesetool als betrachtet.

Aus welchen Gründen können Verzögerungsdeklarationen in einer beliebigen Hardwarebeschreibungssprache (z. B. VHDL, Verilog oder Sytem-Verilog) nicht synthetisiert werden?

Dies ist eine übergreifende Frage, da sie zwischen der Überschneidung von SO und ElectronicsSE liegt.

Antworten (3)

Synthetisieren bedeutet , das, was Sie (in Verilog hier) beschrieben haben , irgendwie in echte Hardware umzuwandeln .

Jetzt sagen Sie in Ihrem Verilog, dass Sie eine Verzögerung von 50 ns haben. Ok, aber jetzt, in Bezug auf die Hardware, wie würden Sie das in tatsächliche Hardware umwandeln?

Wenn Sie ein FPGA verwenden, wie würden Sie Ihre 50-ns-Verzögerung mit den verfügbaren FPGA-Ressourcen (LUT, Register, Ram-Element usw.) tatsächlich aufbauen? Durch Hinzufügen zusätzlicher Routing-Verzögerungen? Stellen Sie sich vor, Sie geben eine Verzögerung von 1 Sekunde an! Unmöglich, ohne die gesamte Routing-Fähigkeit Ihres Chips zu nutzen (möglicherweise nicht genug). Ihr Design kann nicht angepasst werden. Gleiches gilt für einen ASIC. Sie würden 80 % der Siliziumoberfläche verwenden, um einer Leitung eine Verzögerung hinzuzufügen.

Die Art und Weise, wie es funktionieren soll, besteht darin, dass Sie ein synchrones Design verwenden und die Verzögerung selbst mithilfe von Zählern oder anderen Techniken implementieren. Verzögerungen müssen jedoch Vielfache des Takts dieses Elements sein.

Normalerweise finden Sie Dinge wie "nach 10 ns", dies sind Laufzeitverzögerungen. Bei einer idealen Simulation auf einem Verilog-Simulator treten Ausgaben genau dann auf, wenn sich die Eingaben ändern. Dies ist nicht realistisch und beschreibt nicht die Funktionsweise echter Hardware. Um dies zu berücksichtigen, können Sie angeben, nach wie viel Zeit Ihre Ausgabe geändert wird: mithilfe der Verzögerungsdeklaration.

Ich werde anmerken, dass "weil es den gesamten Chip einnehmen würde" nicht wirklich ein Grund dafür ist, warum etwas nicht synthetisiert werden kann, es ist ein Grund, warum etwas nicht angepasst oder innerhalb der definierten Grenzen platziert werden kann.
@W5VO Du hast Recht. Es sollte etwas Absurdes zeigen, das es rechtfertigen würde, einen anderen Weg zu finden. Korrigiert.

Portierung meiner Antwort von SO . Was sich darauf konzentriert, warum es unpraktisch ist, absolute Verzögerungen zu synthetisieren

Beim Synthetisieren von Taktbäumen gleicht das Synthesetool diese aus, indem es Verzögerungen hinzufügt, sodass alle Knoten den Takt zur gleichen Zeit empfangen. Es scheint also, dass das Synthesetool Verzögerungen hinzufügen kann.

Bei der Herstellung von ASICs gibt es jedoch Geschwindigkeitsschwankungen, die auf hohem Niveau als langsam, typisch und schnell angesehen werden können. In der Praxis gibt es Hunderte von Variationen dieser Ecken, bei denen bestimmte Gerätetypen im Silizium schnell und andere langsam laufen.

Diese Ecken des Siliziums haben auch eine Temperaturbewertung, im schlimmsten Fall können +140 °C schnelles Silizium und -40 °C langsames Silizium sein. Die Variation der Verzögerung durch einen Puffer könnte in diesem Fall von 1 ns bis sagen wir 30 ns betragen.

Um dies zu Verilog zurückzubringen, wenn #10es synthetisierbar wäre, würden Sie tatsächlich 155 + -145 erhalten, dh 10 ns bis 300 ns, wenn Sie auch etwas entworfen haben #20, das Teil derselben Schnittstelle oder Kontrollstruktur ist, wird es einen Bereich von 20 ns bis 600 ns haben . Daher ist das Ganze nicht wirklich gegen Ihr Design gültig. Sie erhalten nicht die genauen #10und #20die wurden angegeben.

Die Taktbäume sind so konzipiert, dass sie die maximalen und minimalen Verzögerungen begrenzen und alle Knoten im Taktbaum relativ zueinander skalieren. Ihnen wird nie eine so strenge Regel gegeben, dass es #10ns sein muss, da dies in einer kombinatorischen Schaltung physikalisch unmöglich zu garantieren ist.

Die einzige absolute Zeiteinheit wäre von einer externen Uhr. Woher würde die willkürliche Verzögerung kommen - welche Art von diskretem digitalem Logikäquivalent würde sie aus der Uhr erzeugen?

Wenn Sie eine synthetisierbare Verzögerung wünschen, müssen Sie den externen Takteingang und eine geeignete Zustandsmaschine / einen entsprechenden Zähler verwenden, der für eine bestimmte Anzahl von Taktzyklen zählt.

Dieser Gedanke kam mir gerade in den Sinn. Warum müssen wir uns auf die Uhr verlassen, um Verzögerungen zu erzeugen? Warum kann die Verzögerung nicht mit Vdd zu einer einfachen RC-Schaltung synthetisiert werden?
Die Synthese füllt meistens Werte in Lookup-Tabellen und Routing-Elemente. Ich denke, es ist viel schwieriger, eine feldprogrammierbare RC-Schaltung zu erstellen, insbesondere eine, die nicht zu sehr von der Temperatur beeinflusst wird. Viel einfacher, alles auf die gleiche Taktflanke zu synchronisieren, als auf exakte Laufzeiten zu hoffen.