Read-Write-Weiterleitung
Teil des Abschnitts RTL-Design und Verifikation der Verilog-Journey von Coddy. Lektion 24 von 38.
Eine Speicherschnittstelle muss das Lese-/Schreibverhalten bei derselben Adresse definieren. Forwarding wählt bei einem Zugriffskonflikt explizit die eingehenden Schreibdaten aus und erzeugt dadurch ein New-Data-Verhalten. Ohne diesen Bypass erfasst das vorherige nichtblockierende Lesetemplate alte Daten. Die Speichermodi von Geräten unterscheiden sich, daher garantieren die Simulationssemantiken allein keine Zuordnung zu einem bestimmten Primitiv.
Relevanter Auszug; umgebende Deklarationen und Verbindungen werden in der Aufgabe bereitgestellt.
if(re) begin
if(we && waddr==raddr) q <= data;
else q <= mem[raddr];
endDer Bypass wählt das eingehende Wort nur bei einer tatsächlichen Adresskollision aus.
Definiere das Kollisionsverhalten explizit und überprüfe es anhand des ausgewählten Hardware-Speichermodus.
Aufgabe
MittelImplementiere einen Speicher mit registriertem Lesezugriff, vier Wörtern und Weiterleitung neuer Daten. Die Regeln für Schreiben und Zurücksetzen/Leseaktivierung entsprechen der vorherigen Lektion. Bei einem aktivierten Lesezugriff, der mit einem aktivierten Schreibzugriff auf dieselbe Adresse kollidiert, übernimmt q die eingehenden Daten statt des alten Werts. Bei anderen Lesezugriffen übernimmt es mem[raddr]. 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. Das gesperrte testbench.v stellt Eingangsänderungen bereit und gibt die Ausgaben aus, nachdem sie sich stabilisiert haben. Es 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 mit Dezimalwerten 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