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