【仿真】后仿真中的notifier是奏啥滴!


在進行后仿真的時候,我們經常會發現有人在仿真命令中增加了+no_notifier”,從而使輸出不定態導致的功能異常出現的情況神奇的消失了。那么,到底是為什么會出現這種情況呢?本文將以示例說明notifier到底是干啥滴!

 

Notifier在英文中的意思是通知人、通告人,在后仿真過程中他的作用就跟他的英文意思一樣。在代碼中,notifier是一個reg類型,常作為SystemTimingCheckTask(常用的task如下表所示)的一個參數。

時序檢查系統任務

說明

$setuphold<setup>

檢查建立時間和保持時間,當setup違例時,出現此信息

$setuphold<hold>

檢查建立時間和保持時間,當hold違例時,出現此信息

$setup

檢查建立時間

$hold

檢查保持時間

$recovery

檢查恢復時間(以復位信號為例,可以理解為rst必須在時鍾沿之前的有效的最小時間),一般用於復位、置位等

$removal

檢查撤銷時間(以復位信號為例,可以理解為rst必須在時鍾沿之后的有效的最小時間),一般用於復位、置位等

$recrem

檢查恢復和撤銷時間,一般常用於復位、置位等

$period

檢查周期信號的最小周期,一般常用於時鍾

$skew

檢查兩個信號之間的最大時間差

$width

檢查脈沖的最小寬度

當檢測到存在違例時,參數notifier就會發生變化,然后改參數的變化一般會影響到模擬觸發器行為的udpUser Defined Primitive)中的真值表行為,從而使觸發器模型輸出不定態,最終將不定態反映到仿真輸出上,其執行過程示意圖如下:

 

所以在聲明notifiermodule中一般都會存在SystemTimingCheckTask的調用,否則SystemTimingCheckTask監測到的違例將不能通過notifier反映出來。

【示例】

 

示例中,notifier一般都存在於系統時序檢查任務(SystemTimingCheckTask)的參數列表中,當檢測到時序違例時,時序檢查任務會改變notifier的值,然后示例中udp_dff會檢測到notifier值的變化,然后udp_dff會根據notifier的變化查找其中定義的真值表,最后輸出相應的值(一般會輸出不定態),反映出違例發生。

一般情況下,只要違例發生並且notifier存在於時序檢查任務的參數列表中,此時notifier的值都會發生變化,其值變化的一般規律如下表所示:

時序違例前

時序違例后

Xnotifier默認值)

0

0

1

1

0

z

z

這里需要注意,如果notifier不包括在時序檢查任務中,那么該時序檢查任務在檢測到違例時,並不會改變notifier的值,也不會通過udp將該違例反應在具體的波形輸出上,從而很容易導致時序違例被忽略掉。

另外,在一般操作過程中,不要人為改變notifier的值,這樣可能會導致notifier的變化出現不期望的情況,因為notifier的作用就是通知違例發現了,結果人為修改了就可能會導致沒有發生違例結果udp反映出發生了違例。也不要把notifier的值改為z,此時如果發生違例了,也不會改變notifier的值,因為此時違例發生前后notifier的值都是zudp就不會發現notifier發生變化。

由此我們也可以知道,如果不想讓notifier的變化影響到仿真結果,其實完全可以將notifier從時序檢查任務的參數列表中刪除,但是這樣做修改一個標准單元還可以,面對成千上萬的標准單元如果這樣修改下去是會死人的。為此,目前基本上所有的主流EDA工具都提供了一個仿真命令參數“+no_notifier”,通過這個命令參數可以使時序檢查任務中檢測到時序違例后,不影響其參數列表中的notifier的值,從而避免了notifier變化引起udp輸出不定態的情況,該命令僅對notifier的值有影響,對於時序檢查任務檢測到的時序違例不產生任何影響,如下例所示。

【示例】

 

 

【仿真結果】

Elaboration時不使用“+no_notifier”參數仿真結果如下: 

Elaboration時使用“+no_notifier”參數仿真結果如下:

 

通過仿真波形可以觀測到,使用+no_notifier”之后,時序檢查任務參數列表中的notifier未發生變化,從而屏蔽了notifier變化對於UDP的影響,即q的輸出此時不會出現不定態,保證了標准單元輸出狀態的確定。

雖然在具體的仿真波形上使用+no_notifier”和不使用“+no_notifier”有差別,但是具體的違例信息是相同的,如下圖所示:

 

示例中,在沒有使用+no_notifier”時,當檢測到違例,此時時序檢查任務會改變notifier的值,dff_udp中的真值表檢測到notifier發生變化(*:相當於??,即notifier發生任何變化的意思),此時的輸出qx(不定態)。使用“+no_notifier”時,盡管可以檢測到違例,但是此時時序檢查任務不會改變notifier的值(notifier沒有變化),也就不會影響dff_udp的輸出。

可見,不管是否使用+no_notifier”都不會影響違例信息的產生和報出,雖然使用“+no_notifier”可以避免標准單元輸出不定態,但是這樣就存在一個潛在的問題,因為標准單元此時輸出為確定的狀態,確定的狀態一般也就不會影響后續電路的執行,從而如果忽略log文件將會很容易遺漏一些違例信息,為此從嚴謹的角度出發,除了仿真波形直觀的反應以外,必須對於后仿真的log文件中的違例信息進行詳細的篩查。

 

更多技術內容,可關注下圖個人技術微信公眾號,歡迎朋友們關注溝通!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM