Registrierte Leseports
Teil des Abschnitts RTL-Design und Verifikation der Verilog-Journey von Coddy. Lektion 23 von 38.
Ein registrierter Lesezugriff erfasst an einer Taktflanke Speicherdaten und hält diesen Wert anschließend fest. Eine Lese-Freigabe kann in deaktivierten Zyklen den vorherigen Ausgangswert beibehalten. Das Zurücksetzen des Leseregisters erfordert nicht, jedes Speicherwort zu löschen. Bei nicht blockierenden Lese- und Schreibzuweisungen sieht der Leseausdruck das Wort vor der Taktflanke.
Relevanter Ausschnitt; umgebende Deklarationen und Verbindungen werden in der Aufgabe bereitgestellt.
always @(posedge clk) begin
if(we) mem[waddr] <= data;
if(rst) q <= 0;
else if(re) q <= mem[raddr];
endDas Ausgaberegister wird nur bei der angegebenen Flanke und im aktivierten Pfad aktualisiert.
Latenz beim Lesen des Dokuments, Verhalten bei deaktiviertem Lesen und welcher Zustands-Reset tatsächlich löscht.
Aufgabe
MittelImplementiere einen 8-Bit-Speicher mit vier Wörtern, synchronem Schreiben und registriertem Lesen von q. we schreibt an steigenden Flanken. rst löscht synchron nur q; andernfalls lädt re q aus dem vor der Flanke vorhandenen mem[raddr]; bei re=0 behält q seinen Wert. Der Speicher wird nicht zurückgesetzt, und Schreibvorgänge sind unabhängig von rst. Wenn sich Lesen und Schreiben an einer Flanke dieselbe Adresse teilen, erhält q das alte Wort. Die Tests initialisieren Wörter vor aktivierten Lesevorgängen. Ausgabespalten: q. Alle Steuer- und Datensignale sind vor jeder steigenden Taktflanke stabil; die Ergebnisse werden danach beobachtet.
Vervollständige design.v und bewahre seine Modulnamen und Ports. Die gesperrte Datei testbench.v liefert Eingangsänderungen und gibt die Ausgaben 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 Simulationsbeendigungen 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 we, input re, input [1:0] waddr, input [1:0] raddr, input [7:0] data, output reg [7:0] q);
// Ersetze diesen Platzhalter durch dein Design.
initial q = 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