Implementieren der ADD-Anweisung für den RiSC-16-Prozessor

Ich versuche, den hier dokumentierten RiSC-16-Prozessor (nicht RISC) mit Verilog zu implementieren. Der Prozessor ist wirklich einfach, es gibt jedoch ein Problem, wenn Sie beispielsweise versuchen, ADD-Befehle nacheinander auf einem Register auszuführen

add r1,r1,r1
add r2,r2,r2

Wenn Sie sich die sequentielle Implementierung hier ansehen , funktioniert dieser Code nicht. Hier ist der Grund: Da die Schreibfreigabe der Registerdatei während der gesamten Ausführung eingeschaltet ist, wird das Ergebnis der ersten Anweisung zu Beginn der zweiten Anweisung überschrieben. Dies liegt daran, dass sich die Zieladresse nicht sofort zu Beginn des nächsten Befehlszyklus ändert.

Gibt es eine Möglichkeit, dies zu verhindern?

Schreibt die Registerdatei "ständig", wenn WE behauptet wird? Oder schreibt es nur auf das Taktsignal? Wenn es nur auf das Taktsignal schreibt, haben Sie möglicherweise kein Problem.
@ user253751 Registerdatei schreibt bei steigender Taktflanke, wenn WE bestätigt wird. Es ist also beides.
Was ist dann das Problem? Die Zieladresse ändert sich nicht sofort, aber sie ändert sich vor der steigenden Flanke der Uhr, sodass die Registerdatei die neue Adresse und nicht die alte schreibt.

Antworten (3)

RISC-16 ist RISC. Alle RISC-CPUs sind RISC. Nun, Ihr Beispiel ist eines, das in einer echten Maschine niemals passieren würde. Es ist ein Unsinn. Das Problem kann in der Pipeline liegen, der RISC neigt dazu, alle Befehle in derselben Anzahl von Befehlszyklen auszuführen, die sich aus Abrufen, Decodieren und Ausführen zusammensetzen. Die Pipeline wurde eingeführt, um den Prozessor zu beschleunigen: Das erste Problem ist, dass alle Befehle die gleichen Befehlszyklen haben müssen, um die Vorteile der Pipeline zu nutzen, als nächstes ist es strengstens verboten, Befehle auszuführen, die auf den Wert zugreifen und ihn ändern desselben Registers innerhalb eines Befehlszyklus, da die Pipeline durcheinander geraten würde.

Die einzige Möglichkeit, Ihr Verhalten zu reproduzieren, besteht darin, diese Assembler-Codes absichtlich zu schreiben, da dies kein Compiler tun würde. Wenn Sie auf niedriger Ebene programmieren, sollten Sie sich der Pipeline und ihrer Einschränkungen bewusst sein.

RiSC steht für "Ridiculously Simple Computer", also nicht unbedingt RISC. Außerdem gibt es in diesem Prozessor keine Pipeline. Ich empfehle Ihnen, sich die Dokumentationen anzusehen, die ich im ursprünglichen Beitrag verlinkt habe.
@zeke Nein, RISC steht für Reduced Instruction Set Computer. Jeder, der versucht, diese Definition willkürlich zu ändern, wird die Art von Verwirrung stiften, unter der Sie jetzt leiden.
@ElliotAlderson Das steht wörtlich in der Dokumentation des Prozessors. Ich weiß, was RISC ist, dieser Prozessor heißt nur RiSC.
@zeke Wie viele dieser Prozessoren gibt es tatsächlich? Glaubst du wirklich, du bekommst eine Antwort für eine bestimmte CPU, die niemand hat und nie haben wird?

versuche es umzusetzen...

Sie sagen nicht, WIE Sie versuchen, den Prozessor zu implementieren. Liegt das an Software oder Hardware?

Im letzteren Fall ist das, was Sie beschreiben, ein bekanntes Problem.
Das passiert nicht nur bei

add r1,r1,r1

Aber auch wenn:

add r1,r2,r3
add r4,r1,r2

Die zweite Anweisung verwendet r1, das sich noch in der Pipeline befindet, um geändert zu werden. (Beachten Sie, dass Anweisungssequenzen wie die obige vollkommen gültig sind, um aus einem Compiler zu kommen.)

Die Lösung dafür ist ebenfalls bekannt, sie heißt Registerfaltung .
Es gibt eine spezielle Schaltung, die prüft, ob das Zielregister auch für die Quelle in der Pipeline ist. Wenn dies der Fall ist, stellt ein separater Rückkopplungs-Mux eine Kopie der Daten bereit (die sich irgendwo in der Pipeline befindet).

Wenn ich wieder zu Hause bin, werde ich sehen, ob ich ein Bild des RISC-Prozessors finde, den ich zum Spaß entwickelt habe.

Ich verwende Verilog, um dies auf Hardware basierend auf der dokumentierten sequentiellen Implementierung zu implementieren.

Ich habe dies gelöst, indem ich die neue Anweisung auf derselben steigenden Flanke geschrieben und extrahiert habe. Früher fanden diese beiden Operationen an zwei aufeinanderfolgenden steigenden Flanken statt, jetzt geschehen sie gleichzeitig.