7 / 24 · Konzept
Zeitliche Verhaltensregeln für Speicheranfragen und Antworten
Unterscheiden Sie synchrone Lesezugriffe, verzögerte Tags und Kollisionen an derselben Adresse.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Ein Speicher ist mehr als ein großes Registerfeld
Eine Speicherschnittstelle benötigt neben der Kapazität auch zeitliche Verhaltensregeln. Ein asynchroner Lesezugriff verändert den kombinatorischen Ausgang, sobald sich seine Adresse ändert. Ein synchroner Lesezugriff tastet eine Adresse an einer Flanke ab und verändert den Ausgang danach. Diese Modelle erfordern unterschiedliche Abläufe. Die Abbildung auf eine Speicherressource des Bausteins hängt außerdem vom Programmierstil und dem Zielwerkzeug ab. Hier spezifizieren wir sechzehn Acht-Bit-Einträge mit synchronem Lesezugriff.
Tasten Sie Adresse und Tag an Flanke k ab. Die zugehörigen Daten und der verzögerte Tag erscheinen nach dieser Flanke; ihre erste mögliche Übernahme erfolgt an Flanke k+1. Ein Lesezugriff mit einem Takt Latenz bedeutet keine sofortige kombinatorische Antwort. Die Antwortgültigkeit muss derselben Verzögerung folgen. Die Kombination eines verzögerten Werts mit dem aktuellen Eingabe-Tag führt bei aufeinanderfolgenden Anfragen zu Fehlern.
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
if (wr_en) mem[wr_addr] <= wr_data;
rd_valid <= req_valid;
if (req_valid) begin
rd_data <= mem[req_addr];
rd_tag <= req_tag;
end
if (rst) rd_valid <= 1'b0;
endBei diesem Verhaltensmodell liefert gleichzeitiges Lesen und Schreiben einer Adresse den alten Wert, weil nichtblockierende Zuweisungen den alten Zustand lesen. Tatsächliche Speicherprimitive haben ausdrückliche Kollisionsmodi und Einschränkungen; siehe Lese-/Schreibmodi in AMD UG901 und prüfen Sie den gewünschten Modus anhand des Zielbausteins und des Syntheseergebnisses. Das Zurücksetzen von valid initialisiert das Speicherfeld nicht.
| Flanke | Übernommene Anfrage | Wirkung |
|---|---|---|
| 2 | addr=3,tag=7 | Alten Wert mem[3]=42 erfassen |
| 3 | addr=4,tag=8 | 42,7 übernehmen und den nächsten Wert erfassen |
| 4 | Keine Anfrage | Antwortgültigkeit löschen |
Dieser Ablauf setzt voraus, dass der Empfänger nie wartet. Wartet er an Flanke 3, kann die nächste Antwort rd_data überschreiben. Ergänzen Sie Antwortspeicher oder begrenzen Sie Anfragen anhand der verfügbaren Kapazität einschließlich bereits unterwegs befindlicher Antworten. Initialisieren Sie den Testspeicher ausdrücklich, bevor Sie Werte prüfen. Verifizieren Sie die Zuordnung von Adresse und Tag, nicht nur die Antwortdaten; ein korrekter Wert an der falschen Anfrage ist ebenfalls ein Fehler.
Selbst ausprobieren
Bei mem[3]=42 wird Adresse 3 gelesen und an derselben Flanke 99 dorthin geschrieben. Welchen Wert legt dieses Modell in rd_data ab und welchen neuen Wert hat der Speicher? Was wird für Wartezyklen am Ausgang benötigt?
Erklärung lesen
rd_data wird 42, während mem[3] zu 99 wird. Beide Zuweisungen lesen den alten Zustand. Wartezyklen erfordern Antwortspeicher und eine Annahmesteuerung, die bereits unterwegs befindliche Antworten mitzählt. Prüfen Sie den Kollisionsmodus des tatsächlichen Zielspeichers separat.