2017-08-07 5 views
-1

Wir schreiben einen Miniprozessor, der Informationen gemäß Anweisungen analysiert, die in seinen Speicher geschrieben wurden.FSM des Miniprozessors steckt in Zweig-Gleichschleife

Die erste Anweisung (Adresse 0 im Speicher) in unserer Testbench ist eine While-Schleife geschrieben als ein Zweig gleich: if (delimeter == 0) jump 0.

Um zwischen dem Fall des Wartens auf Delimeter und einem allgemeinen Fall von Verzweigung gleich (oder Verzweigung ungleich) zu unterscheiden, fügten wir ein spezifisches Warte_für_Delimeter-Signal hinzu, aber das Befehlsholen dauert einen Taktzyklus und weil die Pipeline ein NOP einfügt (keine Operationsanweisung) für eine genommene Verzweigung, in der nächsten Uhr kann waiting_for_delimeter nicht 1 sein, weil sie eine NOP "sieht" und nicht die Verzweigungsgleichheitsanweisung.

Kann uns bitte jemand helfen, dies zu lösen?

Danke!

Simulation Waves

+0

über welche sprache sprichst du? Können Sie mehr Code bereitstellen? – Serge

+0

Ich bin in Verilog – efalk

+0

[siehe entsprechenden Code hier] [1] [1] schreibt: https://i.stack.imgur.com/cRDUn.png – efalk

Antwort

0

Ich habe nicht von verstehe Ihre Frage, ob das Signal waiting_for_delimiter den Zweig sieht, auf 1 gesetzt wird, und dann auf Null zurückgesetzt, da der NOP, oder es ist nie Sätze bekommen, weil es nie sieht Ast.

Für den ersten Fall:

Wenn Sie möchten, zu "erinnern" das Signal waiting_for_delimiter 1 beim nächsten Zyklus sein soll, ist es nur probiert ein FF mit:

reg waiting_for_delimiter_r1; 

always @(posedge clk or posedge rst) 
    if (rst) 
     waiting_for_delimiter_r1 <= 1'b0; 
    else 
     waiting_for_delimiter_r1 <= waiting_for_delimiter; 

Auf diese Weise, Im nächsten Zyklus haben Sie die richtige Anzeige in waiting_for_delimiter_r1.

Für den zweiten Fall:

den gleichen Ansatz folgen, und die Anweisung abtasten oder die Angabe, dass die Verzweigung genommen wurde. Verwenden Sie dieses Sampling in der Logik waiting_for_delimiter.