1. 程式人生 > >RTL基本知識:如何正確在敏感信號列表中包含function中的信號

RTL基本知識:如何正確在敏感信號列表中包含function中的信號

公眾 info cti splay sta block right 公眾號 基本知識

在使用Verilog建模組合邏輯時,經常會使用“@*”的方式實現將進程中素有輸入信號隱含加入到敏感信號列表中。但是如果該進程中包含對函數的引用時,盡管使用“@*”,綜合前後的仿真結果還是有出現不一致的情況。本文將對此進行示例說明。

1 問題示例

Verilog中可以在always後使用“@*”來代替冗長的敏感信號列表,這樣做雖然在一定程度上可以保證仿真和綜合的一致性,但是在一些情況下並不完全正確。例如下例,其中的函數引用了全局變量start,期望在start或者value發生變化時分別輸出不同的仿真結果和信息:

技術分享圖片

仿真後的結果和信息如下:

技術分享圖片

技術分享圖片

在5ns和7ns處,全局信號start發生變化,且always語句使用了“@*”隱含增加了過程性語句中的所有信號,但是always調用的函數square2並沒有執行,導致了仿真結果異常,並沒有在start發生變化時輸出預期的結果,顯然“@*”並沒有監測到start的變化。為此,對代碼進行小部分修改,如下:

技術分享圖片

技術分享圖片

更多資訊,請關註個人公眾號:芯光燦爛

技術分享圖片

RTL基本知識:如何正確在敏感信號列表中包含function中的信號