Altifigence Academy

30 / 37 · Konzept

Ready/valid und ein elastischer Einplatzpuffer

Verlust- und duplikatfreie Übergabe sowie gleichzeitige Ein-/Ausgabe bei Stopps entwerfen.

Übertragung bedeutet valid und ready an derselben Flanke

Der Sender setzt valid bei gültigen Daten, der Empfänger ready bei Annahmebereitschaft. Beide werden an der Taktflanke gemeinsam ausgewertet.

transferk=validk∧readyk\mathrm{transfer}_k=\mathrm{valid}_k\land\mathrm{ready}_k

Bei valid=1, ready=0 muss der Sender Daten und valid halten. Wartet er mit valid grundsätzlich auf ready, kann je nach Gegenseite ein Deadlock entstehen. Alle Signale gehören hier zur selben Taktdomäne; ready/validHandshake Transfervertrag: valid des Senders und ready des Empfängers sind an derselben Flanke 1. Dazu gehören Regeln zum Halten wartender Daten. löst keine CDC.

Wartende Daten genau einmal übertragen

Die Spalten sind Abtastzyklen 0–5; Werte gelten unmittelbar vor der steigenden FlankeSteigende Flanke Übergang des Takts von 0 auf 1. Nicht zu verwechseln mit dem gesamten hohen Pegelintervall CLK=1. Mehr erfahren. In 1 und 2 wartet A mit valid=1, ready=0 und bleibt stabil. Flanke 3 nimmt A, Flanke 4 B an. Die Ausrichtung erläutert den Vertrag und modelliert keine Setup-/Hold-ZeitenSetup Mindestzeit vor der Abtastflanke, in der Eingangsdaten stabil sein müssen. Bei Verletzung ist das gespeicherte Ergebnis nicht garantiert. Mehr erfahren.

Ready/valid: Warten und aufeinanderfolgende Übertragungen
Wellenformdaten anzeigen
Wellenformdaten: Jedes Zeichen steht für ein Intervall, ein Punkt hält den vorherigen Zustand und p ist ein Taktzyklus.
SignalWellenformBuswerte
clkp.....
valid01...0
ready10.1..
transfer0..1.0
datax3..4xA → B

Mehrere Zyklen valid=1 bedeuten nicht nur eine Übertragung. An jeder Flanke mit zusätzlich ready=1 findet eine eigene statt.

Einen Puffer für genau ein Element bauen

Ist der Puffer leer oder kann er sein aktuelles Element an dieser Flanke ausgeben, hat er Platz für neue Daten.

in_ready=¬out_valid∨out_ready\mathrm{in\_ready}=\neg\mathrm{out\_valid}\lor\mathrm{out\_ready}
SystemVerilog
module elastic_buffer (
    input  logic       clk,
    input  logic       rst,
    input  logic       in_valid,
    output logic       in_ready,
    input  logic [7:0] in_data,
    output logic       out_valid,
    input  logic       out_ready,
    output logic [7:0] out_data
);
    assign in_ready = !out_valid || out_ready;

    always_ff @(posedge clk) begin
        if (rst) begin
            out_valid <= 1'b0;
        end else if (in_ready) begin
            out_valid <= in_valid;
            if (in_valid) out_data <= in_data;
        end
    end
endmodule

Ein Eingang bei leerem Puffer aktualisiert out_valid und out_data erst nach der Flanke. Ohne kombinatorischen Bypass wird derselbe neue Wert nicht bereits an dieser Flanke als ausgegeben gezählt. Während Reset zählen keine Übertragungen; bei out_valid=0 ist out_data bedeutungslos. Deshalb muss das DatenregisterRegister Speichert einen Zustand aus mehreren Bits. Die synchronen Register dieses Kurses übernehmen festgelegte Eingaben an Taktflanken. Mehr erfahren nicht zwingend zurückgesetztReset Steuerung zur Rückkehr in einen festgelegten Anfangszustand. Synchron/asynchron und Priorität gegenüber anderen Steuerungen müssen definiert werden. Mehr erfahren werden.

Auch ein voller Puffer kann ersetzt werden

Zustand davorout_readyin_validAktion an der Flanke
Leer0 oder 11Eingang speichern, valid=1
Voll00 oder 1Daten und valid halten
Voll10Ausgeben und leeren
Voll11Alten Wert ausgeben, neuen gleichzeitig speichern

Die letzte Zeile ermöglicht nach dem Füllen einen Wert je Zyklus. Latenz halbiert nicht automatisch den DurchsatzDurchsatz Anzahl angenommener oder abgeschlossener Aufgaben je Zeiteinheit. Eine Pipeline kann ihn erhöhen, ohne die Latenz einer einzelnen Aufgabe zu verkürzen. Mehr erfahren.

Ein Modell zur Reihenfolgeprüfung

Verwenden Sie eine Queue mit höchstens einem Element. Bestimmen Sie Aus- und Eingangsannahme anhand der alten Werte an jeder Flanke. Vergleichen Sie zuerst eine Ausgabe mit dem Head, hängen Sie dann neue Daten an. Dequeue und Enqueue können gleichzeitig vorkommen; ihre Modellreihenfolge muss klar sein.

0≤Naccepted−Ndelivered≤10\le N_{\mathrm{accepted}}-N_{\mathrm{delivered}}\le1

Die Invariante gilt innerhalb eines durch Reset neu begonnenen Intervalls. Prüfen Sie zusätzlich Stabilität im Stall, Reihenfolge und keine Duplikate. Zählgleichheit allein beweist keine korrekten Datenwerte.

Lange kombinatorische ready-Ketten erzeugen lange Rückwärtspfade. Prüfen Sie beim Verbinden auch auf kombinatorische Schleifen.

Weiterführend: AMD UG934 — READY/VALID Handshake

Selbst ausprobieren

Der Puffer enthält A, B wartet mit in_valid=1. Erst out_ready=0, an der nächsten Flanke 1. Was geschieht jeweils und wie lange muss B gehalten werden?

Erklärung lesen

Zuerst in_ready=0: A hält, B wird nicht angenommen; der Sender hält B und valid. Danach in_ready=1: A wird ausgegeben, B gleichzeitig gespeichert. Anschließend steht B am Ausgang, ist aber noch nicht übertragen. Das geschieht erst an einer späteren Flanke mit out_valid=out_ready=1.

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.