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?
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.
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 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.
Benutzer253751
Zeke
Benutzer253751