2016-06-26 25 views
0

Zum Beispiel erwähnt Brian Carlton in diesem Thread - How to NOT use while() loops in verilog (for synthesis)?, dass anstelle der Verwendung von For und While-Schleifen in Verilog, sollte eine always Schleife verwendet werden. Ich habe mich gefragt, wie man aus einer Iteration ausbrechen kann, wenn eine bestimmte Bedingung erfüllt ist. Ich frage mich, ob die folgenden verwendet werden:Welche verschiedenen Konstrukte können verwendet werden, um in Verilog aus einem "Immer" -Block auszubrechen?

immer @ (clk posedge oder var == 3) `

Wo var ist eine Variable in dem Modul oder blockieren?

Zum Beispiel, wie würde ich den folgenden Code in etwas konvertieren, das von XST synthetisiert werden kann.

//****************************************************** 
//Check whether randp is prime or not 
//****************************************************** 
for(i = 0; i < 100; i = i+1) 
begin 
    assign PRIME_CHECK = randp; 
    assign sqroot = PRIME_CHECKED; 
for(i = 0 ; i <= sqroot ; i=i+1) 
    begin 
     if((sqroot%i) == 0) 
     begin 
      break; 
     end 
    end 
    break; 
    randp = RANDP; 
end 

Antwort

3

Es gibt keine Möglichkeit zu Ausbrechen von always Block. Sie deklarieren die Existenz eines Prozesses, der immer dort ist. Hardware kann nicht dynamisch erstellt oder zerstört werden. Was Sie tun können, ist den Code um eine Bedingung zu wickeln und um ihn herum zu verzweigen. Aber wenn Sie synthetisierbaren Code schreiben, muss der always Block immer die Codierungsregeln für sequentielle oder kombinatorische Logik folgen.

BTW var ist ein reserviertes Schlüsselwort in SystemVerilog, also verwenden Sie es nicht.

--Aktualisiert-- Jetzt, da Sie den Software-Code hinzugefügt haben, der auf Hardware übersetzt werden soll, ist das eine andere Frage. Bevor Sie aus dieser Schleife ausbrechen können, müssen Sie die Schleife in Taktzyklen einer Zustandsmaschine partitionieren. Dann wird ein Ausbruch aus einer Schleife zu einem Sprung in Ihrer Zustandsmaschine.

+0

Also, wenn ich eine While-Schleife ersetzen wollte, konnte ich '(@posedge clk oder a == 2) beginnen '? – Prateek

+1

Sie müssen die while-Schleife anzeigen, die Sie neu erstellen möchten. @ (expession) ist nur eine Aussage innerhalb der Schleife. Und '(@posedge clk oder a == 2)', obwohl legale Syntax, macht keinen Sinn. Das bedeutet, dass der aktuelle Prozess solange blockiert wird, bis entweder clk von 0 auf 1 wechselt, ODER bis das Ergebnis des Ausdrucks a == 2 irgendeine Änderung hat. Sicher nicht synthetisierbar zu Hardware –

+0

Bearbeitete Frage. – Prateek