Unterschied zwischen RTL und Behavioral verilog

Kann mir jemand sagen, was der Unterschied zwischen RTL und Verhaltenscode von Verilog ist? Gibt es eine klare Abgrenzung zwischen Designs auf diesen beiden Ebenen?

Antworten (4)

Verhaltenscode ist auf höherer Ebene und kann normalerweise nicht synthetisiert werden. Konstrukte wie Schleifen, Verzögerungen und "Anfangs"-Anweisungen sind verhaltensabhängig.

RTL-Code ist untergeordneter Ebene und soll synthetisiert werden. Es definiert eine Schaltung als eine Kombination aus miteinander verbundenen Registern und den Operationen, die an Signalen zwischen diesen Registern durchgeführt werden.

Von Yahoo Answers übernommen und bei Google sofort gefunden!

Schleifen können im RTL-Code verwendet werden, sofern die Anzahl der Iterationen begrenzt ist. Einige Tools unterstützen auch die Verwendung von Anfangsblöcken, um Einschaltbedingungen anzugeben.
Diese Frage/Antwort war eigentlich die erste Antwort, die Google mir gegeben hat

Eine allgemeinere Definition.

Verhaltenscode: Definiert per Definition das Verhalten einer digitalen Komponente. Es gibt keine Informationen darüber, wie es in tatsächliche HW implementiert wird (Synthese). Es gibt keine Informationen darüber, wie Register und Gatter implementiert werden, um die erforderliche Operation durchzuführen. Es ist eher so, als würde man einen Algorithmus oder FSM in C schreiben.

RTL: Genauer gesagt ist es eine digitale Komponente. Es gibt Auskunft darüber, wie der Code als tatsächliche HW (nach der Synthese) implementiert wird. Es gibt auch Informationen darüber, wie Daten zwischen Registern und Gattern übertragen werden.

Der Code der "Registerübertragungsebene" ist ein Code, der in Begriffen von Registern und kombinatorischer Logik beschrieben wird, die zwischen ihnen sitzen und als Eingabe für ein Synthesewerkzeug verwendet werden sollen. Der Code hält sich an eine synthetisierbare Teilmenge[1] der Sprache. Es gibt keine expliziten Verzögerungen, das gesamte Timing bezieht sich auf Taktflanken. Strukturen, die pegelgetriggerte Latches darstellen, werden im Allgemeinen vermieden. Register werden typischerweise von einer kleinen Anzahl von Takten getaktet, deren Details an den Timing-Analysator gegeben werden können. Von der kombinatorischen Logik wird normalerweise erwartet[2], dass sie sich innerhalb eines einzigen Taktzyklus einpendelt, was ihre Komplexität begrenzt. Es ist höher als ein Modell auf Gatterebene, aber es definiert immer noch, welchen Wert jedes Register bei jedem Taktzyklus hat.

"Verhaltenscode" ist im Allgemeinen Code, der Verhalten auf einer höheren Ebene zur Verwendung in einer Simulation beschreibt, aber nicht dazu bestimmt ist, synthetisiert zu werden. Es kann verwendet werden, um die Umgebung Ihres Designs in einer Simulation zu beschreiben. Es kann als ein früher Schritt in einem Design verwendet werden, um das Gesamtdesign an Ort und Stelle zu bringen, bevor das detaillierte RTL-Design der einzelnen Module übernommen wird.

[1] Die genaue zulässige Teilmenge variiert zwischen den Synthesewerkzeugen.
[2] Wenn es sich nicht innerhalb eines einzigen Zyklus einpendelt, können Simulation und Synthese unterschiedliche Ergebnisse liefern, und der Timing-Analysator zeigt eine Verletzung an, es sei denn, es wird ausdrücklich angewiesen, dies nicht zu tun.

Es ist dieselbe Sprache, aber es werden unterschiedliche Stile verwendet. Mit Erfahrung können Sie sie schnell auseinanderhalten, hier sind ein paar Merkmale von jedem:

Verhaltens-Verilog-Code sieht im Allgemeinen eher wie ein sequentielles Computerprogramm aus, das innerhalb eines initial beginBlocks von oben nach unten ausgeführt wird. Möglicherweise stellen Sie fest, dass in Verhaltensmodulen der obersten Ebene keine Eingabe-/Ausgabeports definiert sind, da die Ausgabe an Simulatoreinrichtungen wie die Konsole $display()oder das Dateisystem mit $openoder den Wellenform-Dumper mit $dumpfileund erfolgen kann $dumpvars. Achten Sie auf Verzögerungen zwischen Anweisungen, die durch lange Wartezeiten in der Simulation implementiert wurden, z. B. #4000und beim Aufrufen von Tasks wishbone_master.checked_read(addr, value). Für diese Konstrukte auf höherer Ebene ist es nicht offensichtlich, was das synthetisierte Technologieäquivalent sein würde/könnte.

Verilog für die Synthese hat immer Ein-/Ausgangsports, da das Modul ohne verbundene Ports keine Seiteneffekte hat und eliminiert werden kann [1]. Verzögerungen werden wahrscheinlich durch Zählzyklen einer bestimmten Uhr implementiert. Beachten Sie, dass einige Verilog-Systemfunktionen z . B. $clog2(PARAMETER)im Code für die Synthese zulässig sein können, daher ist das Vorhandensein von $functionin keiner Weise eine Garantie. Code für die Synthese besteht in der Regel aus vielen unabhängigen "Prozessen", die jeweils eine Sensitivitätsliste haben. Einige Technologien erlauben initial beginBlöcke für die Speicherinitialisierung, also ist dies wiederum keine Garantie.

Letztendlich kennt der Designer den Zweck des von ihm geschriebenen Codes und wird ihn entsprechend mit dem Synthese-Toolset oder in einem Simulator aufrufen.

[1] mit Ausnahme bestimmter IP-Blöcke, die Backdoor-Verbindungen zu internen Chipeinrichtungen herstellen können, z. B. JTAG