2017-09-06 44 views
3

如果我所說的任務,並通過引用傳遞的事件,它不會被裏面的任務檢測到事件被觸發後:Systemverilog中的事件可以通過引用傳遞嗎?

event e; 

    fork 
    test_ev(e); 
    begin 
     #1ms; 
     ->e; 
    end 
    join 

    ... 

    task ev(ref event e); 
     @(e) 
     do_something; // this will never happen 
    endtask 

與此試驗檯打圍:http://www.edaplayground.com/x/5YS7,這似乎有些模擬器如參考事件,有些則不。沒有發出編譯警告,但@(..)語句永遠不會傳遞。

這似乎是一個有效的Systemverilog用於我,有沒有我失蹤的警告?

回答

7

沒有必要通過引用傳遞事件變量 - 它已經是一個引用。

這裏的問題是SystemVerilog將兩個構造拼湊成一個關鍵字。在Verilog中,event只是一個無價值的變量,您可以使用觸發器->進行更改,並等待其像任何其他變量一樣更改。

SystemVerilog增強了event數據類型的行爲更像一個類變量。除了event不需要構造函數外,任何事件聲明都會自動構造一個事件對象。這使事件向後兼容Verilog。當您將一個事件變量賦值給另一個事件變量時,您正在將一個句柄複製到一個事件對象。這與複製類變量相同 - 只是複製句柄,而不是對象。

因此,要使您的代碼正常工作,請將ref替換爲input

+0

哇事件的這個類行爲是不直觀的..所以現在我明白爲什麼'輸入'的作品,它是有道理的使用它的方式。我仍然好奇爲什麼在使用'ref'時它不起作用?不應該這樣在任務內創建一個引用嗎? – chinocolerico

+0

我不認爲LRM在這裏很清楚。由於這是對引用事件的引用,所以@e可以被解釋爲等待引用變爲另一個事件對象,而不是事件觸發器本身。可能應該被定爲非法構造。 –

4

傳遞事件爲task ev(event e)也應該通過引用傳遞它,就像它在類對象中發生一樣。按值傳遞事件(即複製它並給函數一個新事件)並沒有意義,因爲事件並不真正存儲數據。我不確定這是否明確列在LRM中,但IMO只是常識。

您的塊未觸發的工具將事件視爲基元並按值傳遞。我會爲這些文件提供支持案例。

+0

我同意在任何通過價值傳遞事件的程序中都沒有意義。但是,乍看之下,我預料他們被當作一個int或bit來對待。如果將事件聲明爲「輸入」問題,問題就會消失,就像@ dave_59所建議的那樣,所以工具似乎在做正確的事情。儘管如此,仍然不確定它爲什麼會失敗 – chinocolerico