在編寫測試平時,經常會用到$monitor和$strobe監測某些信號,并且使用格式上與$display比較類似,但是它們之間還是存在差異的,它們在當前仿真時間槽(time-slot)中被執行的區間是不同的。$display發生在Active區,而$monitor和$strobe發生在當前仿真的最后時刻,即post-pone區,并且一個time-slot是存在很多區域的,因此,它們在觀測具體信號值時是存在一定差異的。
【示例】
【仿真結果】
出現示例中的結果,是因為非阻塞賦值的LHS更新發生在Non-Active區,而此時的$display已經執行完畢,所以$display觀測不到sig更新后的值,但是$monitor發生在Post-pone區,晚于Non-Active區執行,所以可以觀測到sig更新后的值。因此,$display和$monitor觀測到sig的值不同。在實際使用過程中,具體使用哪一種監測方式則根據兩種監測執行的區間特點自行選擇,$strobe與$monitor在本例中監測到的結果是一樣都發生在Post-pone區,執行類似,在此不贅述。那么既然$strobe和$monitor執行效果一樣,都發生在Post-pone區,那么為什么還要同時存在呢?兩者之間有些什么差異呢?下面我們就兩者之間的一些差異進行示例說明。
1 $strobe的執行
$strobe只有在被調用時才會對其中的參數進行監測,此時的參數所具有的值可以認為是其所在當前時間槽(time-slot)中的最終值。另外,$strobe在設計中可以多次被調用,且多次調用相互之間不產生任何影響。
【示例】
【仿真結果】
示例中,在always過程塊中,當敏感時間列表中的信號發生一次變化,always過程塊中的$strobe就會執行一次,并且輸出此次執行時對應參數的穩定值。在initial過程塊中,等待4個時間單位后$strobe執行,并且輸出此時對應參數的穩定值,而在sig變化的其他時刻,該語句并未執行(因為initial塊只執行了一次,并且完成了他的歷史使命)。可見$strobe的執行取決于對其的調用,它的執行并不取決于其中參數的變化,同時可見該語句在代碼中可以被多次調用,并且多次調用之間不會產生相互影響。
2 $monitor的執行
$monitor和$strobe雖然它們監測的參數都是當前時間槽該參數最后的穩定值,但兩者在具體執行上還是有一定差別的,下面通過示例說明$monitor的用法。
【示例】
【仿真結果】
示例中,$monitor位于過程塊中,sig從0時刻開始,每發生一次變化,$monitor就會執行一次,可見$monitor會持續監測其中參數的變化,只要其中參數發生變化,$monitor就會執行。那么是不是其中的任何參數的變化都會觸發$monitor的執行,例如,可不可以使用$monitor監測時間的變化呢?
【示例】
【仿真結果】
示例中,隨著仿真時間的推進,$monitor僅執行了一次。這主要是因為在$monitor中,如果監測的參數是$time、$stime和$realtime這些系統函數的返回值,$monitor對這些時間參數的變化并不敏感。
另外,當$monitor中具有多個參數同時發生變化時,這是因為這些參數在當前時間槽中調用$monitor時都已經處于穩定狀態了,所以此時$monitor只調用一次,如下所示。
【示例】
【仿真結果】
那么,我們可不可以使用多個$monitor監測信號的變化呢?此時$monitor會如何執行呢?我們看看下面的示例。
【示例】
【仿真結果】
示例中,使用了兩個$monitor分別檢測sig1和sig2信號的變化,但是仿真結果僅有一個$monitor執行。這主要是因為$monitor執行上的一個特點,在任意仿真時刻,只有一個$monitor系統任務處于激活執行狀態,至于多個$monitor執行的順序,一般則取決于哪一個$monitor最近一次被調用。除此之外,$nonitor還提供了其他的配置系統任務,可以通過這些系統任務實現對于$monitor執行的控制。
【示例】
【仿真結果】
示例中,$monitoroff和$monitoron之間sig的變化并沒有觸發$monitor系統任務的執行。這主要是因為$monitoroff會不使能當前所有激活的$monitor任務對于其中參數的監測,所以在$monitoroff之后,$monitor監測的參數如果發生變化,將不會觸發$monitor的執行。$monitoron的效果與$monitoroff剛好相反,主要用于再次啟動激活$monitor任務,在$monitoron執行后,如果$monitor監測的參數發生變化,則會觸發$monitor的執行。
綜上所述,$strobe和$monitor執行的主要特定如下:
?$strobe和$monitor監測的相關變量的值,都是這些變量在當前時間槽中的最終穩定值;
?$strobe只有在被調用時才會對其中的參數進行監測,而$monitor只要監測的參數發生變化,$monitor就會執行;
?代碼中可以存在多個$strobe,并且多個$strobe的調用相互之間不影響;
?在$strobe和$monitorr中,如果監測的參數是$time、$stime和$realtime這些系統函數的返回值,$strobe和$monitor對這些時間參數的變化并不敏感
?在任意仿真時刻,只有一個$monitor系統任務處于激活執行狀態,至于多個$monitor執行的順序,一般則取決于哪一個$monitor最近一次被調用;
?可以通過$monitoroff和$monitoron對$monitor的執行進行監測;
審核編輯:黃飛
-
Monitor
+關注
關注
1文章
62瀏覽量
28218 -
配置系統
+關注
關注
0文章
7瀏覽量
6473 -
Strobe
+關注
關注
0文章
2瀏覽量
6327
原文標題:$monitor和$strobe都看的是啥
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論