14 / 24 · Konzept
Ein elastisches Register mit einem Speicherplatz entwerfen
Übernehmen Sie in einen leeren Platz oder ersetzen Sie ein gleichzeitig verbrauchtes Element.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Ready aus verfügbarem Speicher ableiten
Ein Puffer mit einem Platz enthält ein full-Bit und ein Nutzdatenregister. Ist er leer, kann er eine Eingabe übernehmen, auch wenn der Empfänger wartet. Ist er voll, kann er ein Ersatzelement übernehmen, wenn der Empfänger die vorhandene Ausgabe an dieser Flanke übernimmt. Daher gilt input-ready = !full OR output-ready und output-valid = full. Dieser registrierte Puffer besitzt keinen kombinatorischen Datendurchgriff.
Ist input-ready hoch, entspricht das nächste full dem input-valid. Erfassen Sie die Nutzdaten, wenn eine Eingabe vorhanden ist; andernfalls leeren Sie den Platz. Ist input-ready niedrig, erhalten Sie full und Nutzdaten. Wird full allein deshalb gelöscht, weil eine Ausgabe übertragen wurde, geht ein gleichzeitiger Ersatz verloren. Eine Erfassung allein anhand von input-valid überschreibt einen vollen, angehaltenen Platz.
module elastic_byte (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data, in_tag,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data, out_tag
);
logic full;
assign in_ready = !full || out_ready;
assign out_valid = full;
always_ff @(posedge clk) begin
if (rst) full <= 1'b0;
else if (in_ready) begin
full <= in_valid;
if (in_valid) begin
out_data <= in_data;
out_tag <= in_tag;
end
end
end
endmodule| Altes full | out-ready | in-valid | Aktion |
|---|---|---|---|
| 0 | 0 | 1 | Eingabe speichern |
| 1 | 0 | 1 | Eingabe ablehnen und Ausgabe halten |
| 1 | 1 | 1 | Altes Element ausgeben und Ersatz speichern |
| 1 | 1 | 0 | Altes Element ausgeben und Platz leeren |
Speichern Sie tag0,y9 an Flanke 0. Warten Sie an Flanke 1. Übernehmen Sie an Flanke 2 tag0 am Ausgang und speichern Sie tag1,y12; der Platz bleibt voll. Übernehmen Sie an Flanke 3 tag1 und leeren Sie den Platz, falls keine Eingabe vorliegt. Der Ersatz ermöglicht eine Transaktion pro Takt.
Die Verbindung vieler Stufen erzeugt einen rückwärts laufenden kombinatorischen ready-Pfad. Die Registrierung von ready erfordert zusätzlichen Speicher für eintreffende Elemente, bevor die Warteinformation wirksam wird. Prüfen Sie busspezifische Einschränkungen kombinatorischer Pfade separat. Speichern Sie unabhängig von der Nutzdatenbreite die Daten und jedes Begleitfeld unter derselben Bedingung und verifizieren Sie alle vier Aktualisierungsfälle.
Selbst ausprobieren
An einer Flanke mit full=1, out-ready=1 und in-valid=1 wird tag7 verbraucht und tag8 angeboten. Welche Werte haben nächstes full und out-tag? Was geht schief, wenn full beim Verbrauch immer gelöscht wird?
Erklärung lesen
Input-ready ist hoch, also wird tag8 gespeichert und full=1 beibehalten. Out-tag wird 8. Ein grundsätzliches Löschen von full verliert tag8 nach seiner Übernahme.