Erkennung eines vorzeichenbehafteten Multiplikationsüberlaufs in Verilog

Anfänger hier. Ich versuche, einen einfachen 16-Bit-Mikroprozessor in Verilog zu codieren und auf einem Spartan 6 zu implementieren. Die ALU implementiert alle signierten Operationen (überhaupt keine nicht signierten Operationen). Alle Eingänge sind Drähte und sind signiert. Das Ergebnis wird in einem signierten Register gespeichert.

Mein Problem ist es, einen vernünftigen Weg zu finden, um einen Überlauf zu erkennen. Es ist derzeit unerheblich, wie schnell der Überlauf erkannt wird, da nur ein Fehler ausgelöst und das System angehalten wird.

Ich glaube, ich habe herausgefunden, wie ich einen Überlauf beim Addieren und Subtrahieren erkennen kann, aber ich möchte trotzdem Gewissheit haben.

Hier ist zusätzlich, wo o das Überlauf-Flag-Register ist:

if((a_in >= 0) && (b_in >= 0) && (res_out < 0)) o <= 1'b1;
else if((a_in < 0) && (b_in < 0) && (res_out >= 0)) o <= 1'b1;
else o <= 1'b0;

Hier ist die Subtraktion:

if((a_in >= 0) && (b_in < 0) && (res_out < 0)) o <= 1'b1;
else if((a_in < 0) && (b_in > 0) && (res_out >= 0)) o <= 1'b1;
else o <= 1'b0;

Die Steuermatrix berücksichtigt die Haltezeiten für a_in und b_in, so dass die Überlauferkennung abgeschlossen werden kann, da dies erst erfolgt, nachdem das Ergebnis berechnet wurde (beim nächsten Taktzyklus).

Ich habe mich hier umgesehen und nur einen Überlauf in anderen Sprachen wie C oder C ++ festgestellt. Ich suche eine Beispielimplementierung für einen Erkennungsüberlauf bei der vorzeichenbehafteten Multiplikation.

Beide Eingänge a_in und b_in sind vorzeichenbehaftete Adern und 16 Bit breit. Das ebenfalls 16 Bit breite Ergebnisregister res_out ist vorzeichenbehaftet. Im Idealfall hätte ich ein 33 Bit breites Ergebnisregister, in dem ohnehin kein Überlauf auftreten kann, aber dies ist keine Option.

Hilfe wird geschätzt. Bessere Methoden zum Erkennen von Überlauf in Addition und Subtraktion sind ebenfalls willkommen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage