RTL oder HDL? Was ist der Unterschied

Was ist der Hauptunterschied zwischen RTL und HDL? Um ehrlich zu sein, habe ich danach gesucht / gegoogelt, aber die Meinungen sind geteilt. Ich erinnere mich an einen, der sagte, dass HDL die Computersprache ist, die verwendet wird, um eine digitale Schaltung zu beschreiben, und wenn sie synthetisierbar ist, dann wird sie als RTL betrachtet.

Antworten (2)

HDL ist der Sammelbegriff für alle Hardware-Definitionssprachen (Verilog, VHDL usw.), genauso wie sich Object Oriented auf C++, Java usw. beziehen kann.

RTL hingegen ist eine Möglichkeit, eine Schaltung zu beschreiben.

Sie schreiben Ihren Code auf RTL-Ebene in einer HDL-Sprache, die dann (durch Synthesewerkzeuge) in eine Beschreibung auf Gatterebene in derselben HDL-Sprache oder was auch immer Ihr Zielgerät/Prozess benötigt übersetzt wird.

Lassen Sie mich Ihnen ein Beispiel geben. Hier ist eine Verilog-Zeile (HDL), die einen Mux in RTL beschreibt:

assign mux_out = (sel) ? din_1 : din_0;

Ihr Synthesetool kann das nehmen und es in eine Reihe von Logikgattern oder nur ein Mux-Makro konvertieren, das von Ihrem Endgerät unterstützt wird. Beispielsweise könnte es ein Mux-Makro instanziieren

mux u3 (mux_out, din_1, din_0);

In beiden Fällen können Sie dem Block dieselben Eingänge zuführen (RTL oder Gate-Level) und Ihr Ausgang sollte derselbe sein. Tatsächlich gibt es Tools, die die Ausgabe Ihrer Synthese mit Ihrem RTL-Code vergleichen, um sicherzustellen, dass das Tool während der Synthese nicht versehentlich etwas optimiert oder geändert hat, das zu einer Diskrepanz geführt hat. Dies wird als formale Verifizierung bezeichnet.

Aus einer Vielzahl von Gründen, Interoperabilität, einfache Änderung, Verständlichkeit, schreiben Sie Ihre Beschreibung der digitalen Schaltung als RTL und nicht als Gatterebene.

Schöne Antwort, nur eine weitere Verfeinerung ... RTL geht von einem bestimmten Designstil aus - Logikwolke, Register, Logikwolke, Register usw., was ein synchrones (getaktetes) Design impliziert. Wenn Sie in Ihrem HDL für taktloses (asynchrones) Design codiert haben, verwendet Ihr Synthesetool möglicherweise etwas anderes als RTL.
,,Tatsächlich gibt es Tools, die die Ausgabe Ihrer Synthese mit Ihrem RTL-Code vergleichen, um sicherzustellen, dass das Tool während der Synthese nicht versehentlich etwas optimiert oder geändert hat, das zu einer Diskrepanz geführt hat. Dies wird als formale Verifizierung bezeichnet.'' Nein, das ist es nicht. Dies wird als logische Äquivalenzprüfung oder formale Äquivalenzprüfung bezeichnet. Die formale Verifizierung ist vielmehr ein Prozess des Nachweises (mit mathematischen Methoden, ohne Simulation/Prüfstände), dass Ihre Hardwarebeschreibung wirklich das Verhalten beschreibt, das sie beschreiben sollte.

HDL (Hardware Description Language) ist der verwendete Sprachtyp, Verilog/VHDL im Vergleich zu einem Nicht-HDL-Javascript.

RTL (Register-Transfer-Ebene) ist eine Abstraktionsebene, auf der Sie schreiben. Die drei Ebenen, auf die ich mich beziehe, sind Verhaltens-, RTL- und Gate-Ebene.

Verhalten hat die höchste Abstraktionsebene, die das Gesamtverhalten beschreibt und oft nicht synthetisierbar ist, aber zur Verifizierung nützlich ist.

RTL beschreibt die gewünschte Hardware, indem es Logik impliziert. Definieren von Flip-Flops, Latches und wie Daten zwischen ihnen übertragen werden. Dies ist synthetisierbar, die Synthese kann die verwendete Logik ändern/optimieren, aber nicht das Verhalten. Schalten von Muxes für Gates usw. manchmal Invertieren von Signalen, um das Design besser zu optimieren.

Verilog RTL impliziert ein Flip-Flop:

logic a;              //logic is SystemVerilog, could be a 'reg'
logic k;              // Driven by RTL not shown
always @(posedge clk or negede rst_n) begin
  if (~rst_n) begin
    a <= 'b0 ;
  end
  else begin
    a <= k ;
  end
end

Kombinatorische bitweise Operatoren:

logic [1:0] n;
logic [1:0] m;
logic [1:0] result;

assign result = n & m ;

Die Gate-Ebene ist ein Design, das die Basislogikgatter (NAND, NOR, AND, OR, MUX, FLIP-FLOP) verwendet. Es muss nicht synthetisiert werden oder ist das Ergebnis der Synthese. Dies hat die niedrigste Abstraktionsebene. Es sind die Logikgatter, die Sie auf dem Chip verwenden werden, aber es fehlen Positionsinformationen.

Verilog auf Gate-Ebene (gleiche Funktion wie oben):

wire a;
wire k;
DFFRX1 dffrx1_i0 (
  .Q (a),   //Output
  .QN( ),   //Inverted output not used
  .D (k),   //Input
  .CK(clk), //Clk
  .RN(rst_n)// Active Low Async Reset
);

Kombinatorisch

wire [1:0] n;
wire [1:0] m;
wire [1:0] result;

AND2X1 and2x1_i0 (
  .Y( result[0]),
  .A( n[0]     ),
  .B( m[0]     )
);
AND2X1 and2x1_i1 (
  .Y( result[1]),
  .A( n[1]     ),
  .B( m[1]     )
);
Wenn man eine Schaltung als MyReg[7..1] := MyReg[6..0]; MyReg[0] := SerInput; MyReg.Clk = SerClk; MyReg[7..0].AR = !InBus[7..0] & Load; MyReg[7..0].AP = InBus[7..0] & Load;(ein asynchrones Parallellade-Schieberegister, das auf einem Xilinx 9536 CPLD unter Verwendung von Blöcken mit asynchronem Zurücksetzen / Voreinstellen implementiert werden könnte) entwerfen würde, würde dies als RTL oder Gate-Ebene betrachtet werden?
RTL, Gate-Level würde so aussehen, als würden AND(.a(),.b()) OR(.a(),.b())reine Logikgatter angeschlossen. Ich habe den Eindruck, dass RTL alles ist, was Sie synthetisieren möchten, sogar kombinatorische Schaltungen, da Sie immer noch die Änderung der Daten beschreiben, aber nicht die Logikgatter direkt.
Sie haben "Flip-Flop" in Ihre Liste der Basislogikgatter aufgenommen. Da sie in einigen Topologien primitiv sind, dachte ich, dass dies beabsichtigt sein könnte. Das Schreiben einer Verhaltensspezifikation für Dinge, die asynchrones und synchrones Verhalten kombinieren, scheint schwieriger zu sein, als das Verhalten in Bezug auf Flip-Flop-Eingänge, Takte, Async-Preset- und Async-Reset-Pins zu spezifizieren.
Tut mir leid, dass ich nicht folgen kann, werde versuchen, es zu klären. RTL impliziert ein Flip-Flop. Gate-Level instanziiert ein Flip-Flop. Für einfache Schaltungen könnte es einfach sein, eine Reihe von Logikgattern anzuschließen. aber möglicherweise nicht leistungsflächeneffizient. Ein Atom-Prozessor hat 47 Millionen Transistoren, was ungefähr 10 Millionen NAND2-Äquivalenten entspricht. Möchten Sie 10 Millionen handverdrahtete Gates definieren und debuggen? Dies ist der Vorteil, wenn wir ein wenig abstrahieren, wir können das beabsichtigte Verhalten untersuchen und debuggen.
Sicherlich sind für Teile einer Schaltung übergeordnete Beschreibungen hilfreich. Andererseits scheint der Versuch, das Verhalten eines Flip-Flops mit asynchronen Set/Clear-Eingängen zu spezifizieren, komplizierter und weniger intuitiv zu sein, als einfach "benutze einen" zu sagen. Vielleicht wäre eine detailliertere Verhaltensbeschreibung auf Hardware hilfreich, die kein solches Primitiv hat, da es verschiedene Möglichkeiten gibt, das Primitiv auf Hardware nachzuahmen, die es nicht hat; Die Methoden haben unterschiedliche Kosten und leicht unterschiedliche Verhaltensweisen.
Angenommen, jemand versucht, einen 74HC74 in einem HDL anzugeben. Es gibt eine Vielzahl von Möglichkeiten, wie man ein solches Gerät mit einer Kombination aus kombinatorischer Logik, Nur-Synchronisierungs-Flops und transparenten Latches synthetisieren könnte, aber ich kann mir keine Implementierung vorstellen, die keine Race-Bedingungen beinhaltet oder Verhaltensanomalien erzeugt, die dies tun würden existieren nicht mit Hardwareprimitiven (z. B. wenn D und Q hoch sind, sollte ein Runt-Impuls auf CP oder /SD keine Wirkung haben, aber in den Implementierungen kann ich mir vorstellen, dass solche Impulse Metastabilität und / oder einen Ausgangsfehler verursachen könnten).
@supercat Ich bin nicht auf 74HC74 gestoßen, bevor ich annehme, dass wir über ein Dual (2-Bit), Set, Reset, Posedge-Clk-Flip-Flop sprechen. Welcher Teil davon betrifft Sie? zurücksetzen setzen? oder das duale? Aus den Diagrammen, die ich gesehen habe, besteht das Dual nur aus zwei 1-Bit-Flip-Flops. Wenn es sich um das Set-Reset handelt, kann es in rtl impliziert werden, und das Set-Reset-Flip-Flop-Grundelement würde bei der Synthese verwendet werden. Oder habe ich deinen Punkt übersehen?
Wenn man Hardware verwendet, deren Flip-Flops keine asynchrone Set/Reset-Fähigkeit haben, ist es möglich, ein solches Verhalten zu synthetisieren, aber ich kenne keine Möglichkeit, ein solches Verhalten zu synthetisieren, ohne Race-Bedingungen auszunutzen, die korrekt auf alle legitim reagieren - zeitgesteuerte Eingangsbedingungen, die dazu führen sollten, dass es den Zustand ändert, und ignorieren (ohne Ausgangsstörungen oder Metastabilität) Eingangsübergänge, unabhängig vom Timing, was eindeutig nicht dazu führen sollte, dass es den Zustand ändert [z ]
Wenn man zum Beispiel Flops mit Async-Reset, aber nicht Async-Set hat, könnte man einen Flop verwenden, um den Zustand von D zu erfassen, eine Logik, um zu erfassen, ob "Set" oder "Clear" zuletzt angesteuert wurde, einen Flop, um anzuzeigen, ob "Set " und/oder "clear" seit dem letzten Taktimpuls angesteuert wurden, und ein Mux, um entweder den D-Latch oder den Set/Clear-Latch auszuwählen. Ein derartiger Ansatz würde im eingeschwungenen Zustand korrekt funktionieren, könnte jedoch Ausgangsstörungen aufweisen, wenn zwischen dem Melden von D-Flop- oder RS-Latch-Daten umgeschaltet wird. Die Gefahrenvermeidungslogik in der Ausgabe kann hilfreich sein, aber ich weiß nicht, ob sie alles beheben würde.
Ich denke, wir sprechen über den Aspekt der Codeportabilität von RTL, aber wenn Sie versuchen, ein Set-Reset-Flip-Flop zu implizieren, wenn Ihre Basisbibliothek keines hat, und HOFFEN, dass das Synthesetool eines hervorzaubern kann, dann ja, das wird führen zu Problemen. Ich würde hoffen, dass das Synthesetool davor warnt. Was RTL Ihnen bietet, ist die Möglichkeit, Bibliotheken/Foundries-Resynthesen zu ändern und das gleiche funktionale Design zu erhalten.
Auf solche Anforderungen stoße ich eigentlich eher selten. Einige Schnittstellen mit niedriger Latenz und niedriger Taktrate erfordern ein oder zwei Set-Resets, aber ich habe nie mehr davon verwendet, die anderen paar Tausend sind normale D-Typen.
Um auf meine ursprüngliche Frage zurückzukommen, wenn sich ein Teil des eigenen Geräts wie ein Flop mit asynchronem Set/Reset verhalten muss (z. B. weil es mit Dingen in der Außenwelt interagiert, die ein solches Verhalten erwarten), würde die Angabe von Dingen in Bezug auf „MyLatch.D gets dies; MyLatch.clk erhält dies; MyLatch.AR erhält dies; usw." als Spezifikation auf Gate- oder Register-Transfer-Ebene angesehen werden? Gibt es auch verhaltensmäßig eine Möglichkeit, anzugeben, unter welchen Bedingungen die Ausgänge einer Schaltung fehlerhaft sein dürfen und unter welchen Bedingungen sie stabil bleiben müssen?
Wie erstellen MyLatchSie eine instanziierte Basiszelle oder ein implizites Latch? Wenn Sie das Gate instanziieren, ist es Gate-Level. Wenn Sie es implizieren, ist es RTL. Die Gate-Level-Bibliothek wird mit Timing verknüpft sein, um Rennbedingungen/Glitches usw. zu modellieren. RTL-Simulationen laufen mit idealen Komponenten.