9 / 24 · Konzept
Die vollständige Transaktion an Pipeline-Grenzen speichern
Teilen Sie Addition und Skalierung auf und halten Sie valid, Tag und Bitbreiten aufeinander abgestimmt.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Eine Registergrenze transportiert Bedeutung ebenso wie Bits
Teilen Sie f(a,b)=3(a+b) auf zwei Stufen auf. Stufe eins speichert die Neun-Bit-Summe zweier vorzeichenloser Acht-Bit-Operanden. Stufe zwei bildet einen skalierten Elf-Bit-Wert und speichert dessen untere acht Bits. Das maximale breite Ergebnis beträgt 1530. Eine Kürzung der Zwischensumme erhält bei diesem ganzzahligen Ausdruck zufällig den endgültigen Modulo-256-Wert, würde aber Informationen für eine Überlaufmeldung oder spätere Vergleiche verlieren. Definieren Sie die Zwischenbitbreite ausdrücklich.
Jede Stufe speichert valid und Tag zusammen mit den Daten. Valid Null kennzeichnet eine Leerstelle. Alte Datenbits können in einer leeren Stufe verbleiben, dürfen jedoch nicht als Transaktion zählen. Ein Tag benötigt dieselbe Registerverzögerung wie sein Wert. Zwei Datenregister mit nur einem Tag-Register ordnen dem Ergebnis von Transaktion A die Identität von Transaktion B zu.
Dieser Kern setzt keine Wartezyklen und stets bereite Anschlüsse voraus. Erweitern Sie s1 und dimensionieren Sie die Konstante vor der Multiplikation. Die zweite Stufe liest altes s1 und t1; eine neue Eingabe kann nicht an einer Flanke beide Register durchlaufen.
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
v2 <= 1'b0;
end else begin
v1 <= in_valid;
v2 <= v1;
if (in_valid) begin
s1 <= {1'b0, a} + {1'b0, b};
t1 <= in_tag;
end
if (v1) begin
s2 <= scaled[7:0];
t2 <= t1;
end
end
endÜbernehmen Sie A=(1,2) an Flanke 0: Danach ist s1=3. Übernehmen Sie B=(250,10) an Flanke 1: s1 wird 260, während s2 das Ergebnis 9 von A speichert. A ist nach Flanke 1 gültig und kann an Flanke 2 übertragen werden. B liefert später 780 modulo 256, also 12.
Führen Sie auch Leerstellen durch die valid-Register. Wird bei fehlender Eingabe altes v1=1 gehalten, kann eine Transaktion verdoppelt werden. Reset löscht den Gültigkeitszustand, damit alte Daten kein neues Ergebnis werden. Listen Sie an jeder Grenze alle Begleitfelder auf: Operation, Tag, Ausnahme, Adresse oder Paketendemarkierung. Prüfen Sie, dass diese Felder während der gesamten Pipeline zu einer einzigen Transaktion gehören.
Selbst ausprobieren
A=(1,2,tag=10) und B=(250,10,tag=11) werden nacheinander übernommen. Welcher Tag begleitet das Ergebnis von A, wenn t2<=in_tag verwendet wird? Geben Sie die richtige Verbindung an.
Erklärung lesen
An Flanke 1 berechnet s2 die alte Transaktion A, während das aktuelle in_tag 11 ist; daher erhält Ergebnis 9 den Tag 11. Verwenden Sie t2<=t1, um den alten Stufe-eins-Tag 10 von A zu erfassen.