Pipelining von Daten und Valid
Teil des Abschnitts RTL-Design und Verifikation der Verilog-Journey von Coddy. Lektion 18 von 38.
Pipelines teilen die Arbeit auf mehrere Register auf. Ein Gültigkeitsflag wird neben jedem Datenelement weitergegeben, damit eine nachgelagerte Stufe ein Sample von einer Leerstelle unterscheiden kann. Bei nicht blockierenden Zuweisungen liest eine spätere Stufe an derselben Taktflanke den vorherigen Wert einer früheren Stufe. Ein Reset sollte sich noch in der Pipeline befindliche Arbeit ungültig machen.
Relevanter Auszug; umgebende Deklarationen und Verbindungen werden in der Aufgabe bereitgestellt.
always @(posedge clk) begin
stage <= data;
stage_valid <= in_valid;
result <= stage;
out_valid <= stage_valid;
endDie Daten und ihre Gültigkeit werden durch dieselbe Anzahl von Registern weitergeleitet.
Richte Daten und Gültigkeit über jede Pipeline-Stufe hinweg aus und lösche die Gültigkeit beim Zurücksetzen.
Aufgabe
MittelImplementiere eine Pipeline mit zwei Registerstufen. Bei jeder Flanke ohne Reset erfasst Stufe eins a und in_valid. Stufe zwei verwendet die vorherigen Werte der ersten Stufe: out_valid wird zu ihrem alten Valid-Wert, und y wird bei gültigem Wert zu ihren alten Daten plus eins modulo 256, andernfalls null. Das synchrone rst löscht beide Stufen und die Ausgänge. Ausgabespalten: y, out_valid. Alle Steuer- und Datenleitungen sind vor jeder steigenden Taktflanke stabil; die Ergebnisse werden anschließend beobachtet.
Vervollständige design.v und bewahre dessen Modulnamen und Ports. Die gesperrte testbench.v liefert Eingangsänderungen und gibt die Ausgänge aus, nachdem sie sich stabilisiert haben. Sie wählt ein Szenario mithilfe eines Simulatorarguments wie +CASE=1 aus; eine Standardeingabe ist nicht erforderlich. Füge dem Design keine Ausgaben, Verzögerungen oder Simulationsbeendigung hinzu. Die erwartete Ausgabe besteht aus einer Zeile dezimaler Werte pro Beobachtung, durch ein Leerzeichen getrennt und mit einem Zeilenumbruch abgeschlossen.
Probier es selbst
module dut (input clk, input rst, input in_valid, input [7:0] a, output reg [7:0] y, output reg out_valid);
// Ersetzen Sie diesen Platzhalter durch Ihr Design.
initial y = 0;
initial out_valid = 0;
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in RTL-Design und Verifikation
1Zuverlässige kombinatorische RTL
Standardwerte verhindern LatchesPrioritätsencoderOne-Hot-ValidierungSichere Case-DekodierungRückblick – Request-Router4Kontrolliertes sequentielles RTL
Priorität von Reset und EnableSättigungszählerPipelining von Daten und ValidErkennen abgetasteter FlankenRückblick – Ereigniszähler2Bitbreiten und vorzeichenbehaftete Arithmetik
Übertragsbits bewahrenVorzeichenbehaftete VergleicheArithmetische RechtsschiebungenÜberlauf und SättigungRückblick – vorzeichenbehaftete Differenz5Speicher und Nachschlagetabellen
Kombinatorische ROM-TabellenSpeicherung in Register-ArraysRegistrierte LeseportsRead-Write-WeiterleitungRückblick – Bank mit zwei Leseports8Abschließende Herausforderungen
Herausforderung – Paritäts-PipelineHerausforderung – MusterereignisseHerausforderung – Begrenzte SummeÜbe selbstständig: Online-Verilog-Compiler