31 / 37 · Konzept
Multiply-add-Pipeline und Datenausrichtung
Berechnungen an Registergrenzen teilen und Daten, valid sowie Nebenoperanden derselben Transaktion zuordnen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Aus einer Berechnung werden zwei Stufen
Voraussetzungen: Signed-Arithmetik, nonblockingNonblocking Sequenzielle RTL-Zuweisung mit <=. Nach Auswertung der rechten Seite wird die Aktualisierung geplant, sodass Register derselben Flanke den alten Zustand verwenden. Mehr erfahren, SetupSetup Mindestzeit vor der Abtastflanke, in der Eingangsdaten stabil sein müssen. Bei Verletzung ist das gespeicherte Ergebnis nicht garantiert. Mehr erfahren und valid.
Jede Transaktion enthält signed 8-Bit-a, b und signed 16-Bit-c. Das Ergebnis lautet wie folgt; es ist ein unabhängiges Multiply-add je Transaktion, kein Akkumulator.
Das exakte 8-Bit-Produkt braucht 16 Bit. Eine 16-Bit-Addition von c mit erst anschließender Erweiterung kann verlorene obere Bits nicht zurückholen. Erweitern Sie beide Operanden vorher auf signed 17 Bit.
Stufe 1 speichert Produkt und c gemeinsam; Stufe 2 addiert Werte derselben Transaktion. Ohne c-Verzögerung vermischt sich das alte Produkt mit dem aktuellen c.
module multiply_add_pipeline (
input logic clk, rst, in_valid,
input logic signed [7:0] a, b,
input logic signed [15:0] c,
output logic out_valid,
output logic signed [16:0] y
);
logic v1;
logic signed [15:0] p1, c1;
logic signed [16:0] p_ext, c_ext;
assign p_ext = {p1[15], p1};
assign c_ext = {c1[15], c1};
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
out_valid <= 1'b0;
end else begin
v1 <= in_valid;
out_valid <= v1;
if (in_valid) begin
p1 <= a * b;
c1 <= c;
end
if (v1) y <= p_ext + c_ext;
end
end
endmoduleDie Schnittstelle kann an jeder Flanke annehmen und setzt einen stets bereiten Verbraucher voraus. y mit out_valid=0 wird nicht verglichen. Initialisiertes valid unterscheidet ungenutzte Daten auch ohne ResetReset Steuerung zur Rückkehr in einen festgelegten Anfangszustand. Synchron/asynchron und Priorität gegenüber anderen Steuerungen müssen definiert werden. Mehr erfahren der DatenregisterRegister Speichert einen Zustand aus mehreren Bits. Die synchronen Register dieses Kurses übernehmen festgelegte Eingaben an Taktflanken. Mehr erfahren.
Zwei Stufen und Beobachtungspunkte unterscheiden
Die Tabelle zeigt Annahme je Flanke und Registerzustand unmittelbar danach. A und B sind unterschiedliche Transaktionen.
| Flanke | Annahme | Stufe 1 | Ausgangsregister |
|---|---|---|---|
| E0 | A | Produkt und c von A | Ungültig |
| E1 | B | Produkt und c von B | Ergebnis A, gültig |
| E2 | Keine | Ungültig | Ergebnis B, gültig |
| E3 | Keine | Ungültig | Ungültig |
A ist direkt nach E1 bereit; die folgende gleich getaktete Schaltung liest es an E2. Von Annahme E0 bis Empfang E2 liegen zwei Perioden. Vermischen Sie Ausgangsregisteränderung und nachfolgende Annahme nicht in Latenzangaben.
Jede Spalte dokumentiert eine steigende FlankeSteigende Flanke Übergang des Takts von 0 auf 1. Nicht zu verwechseln mit dem gesamten hohen Pegelintervall CLK=1. Mehr erfahren. Eingänge gelten unmittelbar davor, Zustände mit „after“ unmittelbar nach der Aktualisierung. Die Spalten zeigen die Reihenfolge der Abtastungen, keine physische LaufzeitLaufzeit Zeit nach einer Eingangsänderung, bis der Ausgang auf dem richtigen Wert stabil ist. Logische Äquivalenz und zeitliche Eigenschaften sind getrennte Aussagen. Mehr erfahren. A=(2,3,10), B=(4,5,100). Stufe 1 speichert Produkt und c zusammen, die nächste Flanke addiert die alten Stufenwerte. Striche bedeuten ungültig.
Wellenformdaten anzeigen
| Signal | Wellenform | Buswerte |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| accepted | 234. | A → B → - |
| product1 after | 234. | 6 → 20 → - |
| c1 after | 234. | 10 → 100 → - |
| y after | 2345 | - → 16 → 120 → - |
| out_valid after | 01.0 |
Wie viel schneller wird eine Pipeline?
Ein einfaches Rechenmodell nimmt 3.2ns Multiplikation,1.1ns Addition und 0.2ns Registeraufwand an. Dies sind Beispielannahmen.
Die obere Frequenzgrenze steigt ungefähr von 222MHz auf 294MHz. Zwei Stufen verdoppeln den Durchsatz nicht zwangsläufig: langsamste Stufe und Registerkosten bestimmen die Periode. Reale Werte hängen von Synthese, Platzierung und Constraints ab.
Transaktionsweise prüfen
Bei Annahme fügen Sie a×b+c einer Ganzzahlreferenz-Queue hinzu. An der Flanke gültigen Ausgangsempfangs wird deren Head verglichen. Fügen Sie in_valid=0 ein und prüfen Sie, ob Bubbles mit den Daten wandern. Stark wechselndes c zwischen Transaktionen deckt fehlende Ausrichtung gut auf.
Weiterführend: MIT OpenCourseWare — Performance Measures
Selbst ausprobieren
A=(3,−4,10), B=(2,5,100) folgen direkt aufeinander. Welche Ausgaben sind korrekt, und welcher falsche A-Wert kann ohne c-Verzögerung entstehen?
Erklärung lesen
A ergibt −12+10=−2, B 10+100=110. Trifft A-Produkt auf B-c=100, entsteht 88. Korrekt verzögertes valid korrigiert keine falsch ausgerichteten Operanden.