2016-09-26 12 views
0

Ich habe einen Block, der wie folgt aussieht:Seltsames Verhalten innerhalb Gabelblock

fork 
     begin  
      $display("before repeat");   
      repeat (delay_before_rsp2data) #1ps; 
      $display("after repeat"); 

      $display("some information"); 
      `ovm_do_on_with("do some stuff"); 
     end 
join_none 

In fast allen Fällen ist es gut funktioniert, aber in einem Fall (die ich gefunden), nach dem `ovm_do_on_with Linie, es springt zurück zur Wiederholungslinie und von dort fortfahren. Ich weiß, dass dies geschieht, weil das, was angezeigt wird, ist:

before repeat 
after repeat 
some information 
[all the displays from the `ovm_do_on_with part] 
after repeat 
some information 
[all the displays from the `ovm_do_on_with part] 

Ich habe versucht, im Innern eines die ganze ‚Repeat‘ ​​Linie setzen, bevor Endblock, mit einem for-Schleife wechseln, und ein paar mehr Kombinationen wie die , aber immer das gleiche Verhalten.

Irgendeine Idee, was könnte das verursachen?

+0

Vielleicht sollten Sie eine [MCVE] Post (http://stackoverflow.com/help/mcve). Ich kann das Problem nicht sehen, aber vielleicht müssen Sie Ihre Semikolons überprüfen. Es sollte eins nach den ersten beiden $ Display's geben. –

+0

es ist nicht wirklich verifizierbar, da es nur auf einem bestimmten Seed zu einer bestimmten Zeit passiert, die es in den Block eintritt, ich weiß nicht, ob es weitere Informationen gibt, die ich geben kann. –

Antwort

4

Es scheint, dass Sie die fork ... join_none mehr als einmal ausführen (wahrscheinlich in der Schleife) und ich denke, die delay_before_rsp2data ist zufällig. Wenn dies der Fall ist, dann die after repeat Sie sah möglicherweise nicht aus dem gleichen Thread wie die before repeat.

Mein Vorschlag, fügen Sie eine Art von id zu debuggen und verfolgen, aus welchem ​​Thread es ist. Zum Beispiel

int id=0; 

task my_fork; 
    fork 
    automatic int k; // !! must be automatic 
    begin 
     id++; k = id; 
     $display("before repeat, id %d", k); 
     repeat(delay) #1ps; 
     $display("after repeat, id %d", k); 
     `uvm_do_on_with(); 
    end 
    join_none 
endtask 

Dann sollten Sie in der Lage sein, die Fäden zu verfolgen und sie korrelieren. Denken Sie daran, automatic variable innerhalb fork join_none zu verwenden, so dass es Thread hat einzigartige id.

Einige schnelles Beispiel:

http://www.edaplayground.com/x/4vRd

+0

Ja, das war's (übrigens, nachdem ich zwei Tage daran festhielt, fand ich es etwa 10 Minuten vor der Antwort heraus). Vielen Dank! Es war alles innerhalb einer Schleife für immer, deren erste Zeile ein "Get" ist, so dass die Gabel durch ein neues Paket unterbrochen wurde. Die Lösung war, die Verzögerung einfach in die Sequenz zu verschieben, die von 'ovm_do' aufgerufen wurde, wobei die neuen Pakete den Fluss unterbrechen und die Variablen überschreiben (die nicht lokal genug waren). –

+0

Gut, dass Sie es gelöst haben. Kein Problem. – AldoT