2017-01-26 4 views
-2

ich den folgenden Code in einem meiner Monitor haben:Warum Ausdruck Ursache warten blockiert

virtual task run_phase(uvm_phase phase); 
     forever begin 
    mon_trx = tx_upconv_in_transaction::type_id::create("mon_trx"); 
    wait (vif.chind2 == 32'h0); 
    mon_trx.xi = vif.xi; 
    mon_trx.xq = vif.xq; 
     $display("TRX.XI = %h, TRX.XQ = %h", mon_trx.xi, mon_trx.xq); 
     end 
    endtask: run_phase 

Als ich die Simulation laufen I (der Anzeige) viele Drucke sehen, aber die Zeit nicht hindurchgeht .

Warum?

p.s chind 2 ist eine Ganzzahl (Daten).

+1

Das Warten wartet auf einen Signalpegel, nicht auf eine Flanke. Sobald chind2 = 0 ist, wiederholt sich die Schleife. Es ist wie eine Endlosschleife und dein Display wiederholt sich. Sie benötigen eine andere Zeitsteuerungs-Anweisung in Ihrer Schleife. – toolic

+0

@toolic - wie was? – sara8d

Antwort

0

Vermutlich, weil vif.chind2 == 1'b0? Wenn der Ausdruck, auf den gewartet wird, bereits erfüllt ist, wenn die Anweisung wait ausgeführt wird, wird die wait-Anweisung nicht blockiert.

Wenn Sie vif.chind2 warten wollen 1'b0 werden, wie über Ihre wait Anweisung ersetzt mit:

wait (vif.chind2 != 32'h0); 
wait (vif.chind2 == 32'h0); 
+0

Ja. Für den 'vif.chind' Wechsel zu 1'bo. – sara8d

+0

@noobuntu- chind 2 ist eine Ganzzahl (Daten), daher bin ich mir nicht sicher, ob ich in diesem Fall auf negedge/posedge verweisen kann. – sara8d

+0

@ sara8d Aktualisiert ... –

0

wait Aussage ist pegelgetriggert, nicht flankengetriggert. Wenn Ihr Signal immer 1'b0 ist, wird es ohne Blockierung ausgeführt.

Wenn Sie nach einem NEGEDGE suchen, können Sie es ändern zu

wait ($fell(vif.chind2)); 

Dieser erkennt einen NEGEDGE auf dem Signal und blockiert, bis dann.

Verwandte Themen