Speicherung in Register-Arrays
Teil des Abschnitts RTL-Design und Verifikation der Verilog-Journey von Coddy. Lektion 22 von 38.
Ein nicht gepacktes Array kann Wörter eines Hardwarespeichers modellieren. Ein getakteter Schreibvorgang aktualisiert ein ausgewähltes Wort; ein kontinuierlicher Lesevorgang wählt ein Wort ohne Lese-Takt aus. Die Synthese kann kleine Arrays mit Registern implementieren oder bei unterstützten Mustern Speicherressourcen ableiten. Gehe niemals davon aus, dass ein nicht beschriebenes Wort mit null beginnt.
Relevanter Auszug; umgebende Deklarationen und Verbindungen werden in der Aufgabe bereitgestellt.
reg [7:0] mem [0:3];
always @(posedge clk)
if(we) mem[waddr] <= data;
assign q = mem[raddr];Der Schreibvorgang ist flankengesteuert, während das Lesen dem ausgewählten gespeicherten Wort folgt.
Definiere Schreibfreigabe und Lesezeitverhalten explizit; verlasse dich nicht auf nicht spezifizierte initial-Speicherinhalte.
Aufgabe
MittelImplementiere vier 8-Bit-Wörter. An einer steigenden Flanke schreibt we Daten in mem[waddr]. q ist ein asynchrones kombinatorisches Lesen von mem[raddr]. Der Speicher hat keinen Reset und keine initial-Inhalte; die Testbench schreibt jede beobachtete Adresse, bevor sie sie liest. Die Beobachtungen erfolgen nach der Flanke, daher ist ein Schreiben auf dieselbe Adresse in q sichtbar. Ausgabespalten: q. Alle Steuer- und Datensignale sind vor jeder steigenden Taktflanke stabil; die Ergebnisse werden danach beobachtet.
Vervollständige design.v und bewahre die Modulnamen und Ports. Die gesperrte 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; 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 we, input [1:0] waddr, input [7:0] data, input [1:0] raddr, output [7:0] q);
// Ersetze diesen Platzhalter durch dein Design.
assign 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