2017-01-26 60 views
-2

我在監視器的一個下面的代碼:爲什麼等待的表達導致阻塞

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 

當我運行仿真我可以看到許多照片(的顯示),但時間不及格。

爲什麼?

p.s chind 2是整數(數據)。

+1

'wait'等待信號電平,而不是邊緣。只要chind2 = 0,循環不斷重複。這就像一個無限循環,你的顯示不斷重複。您的循環中需要另一個時序控制語句。 – toolic

+0

@toolic - 像什麼? – sara8d

回答

0

推測是因爲vif.chind2 == 1'b0?如果在執行wait語句時等待的表達式已經爲真,則wait語句不會被阻止。

如果你想等待vif.chind2成爲1'b0,如何與更換您wait聲明:

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

是的。對於'vif.chind'換成1'bo。 – sara8d

+0

@ noobuntu-chind 2是整數(數據),所以我不確定我可以在它的情況下引用negedge/posedge。 – sara8d

+0

@ sara8d更新中...... –

0

wait語句是電平觸發的,而不是邊沿觸發。如果你的信號始終是1'b0,那麼它將在沒有阻塞的情況下執行。

如果你正在尋找一個negedge,你可以把它改成

wait ($fell(vif.chind2)); 

它可以檢測你的信號和塊negedge到那時。

相關問題