1. 前言
在硬件電路中,為了使系統在異常情況下能自動復位,一般都需要引入看門狗(Watchdog)。看門狗其實就是一個定時器電路。當看門狗啟動后,計數器開始自動計數,經過一定時間,如果沒有被清零,計數器溢出就會對CPU產生一個復位信號使系統重啟(俗稱“被狗咬”)。系統正常運行時,需要在看門狗允許的時間間隔內對看門狗計數器清零(俗稱“喂狗”),不讓復位信號產生。如果系統不出問題,程序保證按時“喂狗”,一旦程序跑飛,沒有“喂狗”,系統“被咬”復位。
2. Heartbeat作用
UVM heartbeat在UVM中充當類似看門狗定時器的角色,我們可以設定它的定時長度,也就是在這時間內必須要喂狗,還可以設定heartbeat要監控的組件。uvm_heartbeat 監視測試環境中組件的活動,如果發現在指定的時間間隔內沒有活動,則 uvm_heratbeat 發出UVM_FATAL消息,導致模擬結束,可以在早期階段檢測仿真掛住,而不是在全局仿真超時到期時檢測:
- 這將有助于識別導致死鎖的組件;
- 通過提前終止仿真來節省仿真時間并釋放資源;
既然uvm_heartbeat類似于看門狗,那么在使用上,只需要關注以下三件事:
- 配置它的定時長度 (這段時間內沒有喂狗就終止仿真)
- 配置它需要監控的對象 (由哪些對象去喂狗)
- 設置多長時間喂狗 (正常情況下這個時間要小于步驟1的定時長度,除非TB或RTL出問題了)
3. Heartbeat內置函數
uvm_heartbeat 類派生自 uvm_object,它提供一組內置方法來方便用戶使用。有如下:
注意:uvm_event e 必須定期觸發,它會設置一個監視窗口。如果heartbeat監視器在該時間段內未發現任何活動,則會生成 HBFAIL UVM_FATAL消息。一般來說,事件e可以在無限循環中觸發,作為一個永遠持續的過程。
4. Heartbeat例子
根據heartbeat的作用和內置函數,舉個使用例子。
第一步創建喂狗的uvm_objection實例(假設為uvm_objection obj=new(“obj”)),這個objection需要傳遞給uvm_heartbeat和所有被監控組件,被監控組件需要定期去raise這個obj來達到喂狗的目的。
第二步創建觸發監控窗口的uvm_event實例(假設為uvm_event hb_e=new(“hb_e”)),這個event決定了多長時間去檢查下是否有組件喂狗了,也就是raise objection。
第三步就是創建uvm_heartbeat實例(假設為uvm_heartbeat hb=new("hb", this, obj)),在這里把obj傳遞進去了。
第四步設置uvm_heartbeat的工作模式,比如hb.set_mode(UVM_ANY_ACTIVE)。
第五步設置uvm_heartbeat觸發檢查的event和檢查對象,比如hb.set_heartbeat(hb_e,hb_comp)。這里面把event hb_e和監控組件列表comp傳遞給uvm_heartbeat了。
此時uvm_heartbeat就正式開始工作了,在hb_e每次被trigger()的時候,根據當前工作模式去檢查各個被監控組件是否有調用過obj.raise_objection(this)。如果沒有,就會停止仿真,表明驗證環境有異常情況。另外一點大家主要注意的是,被監控的多個組件raise的objection是同一個,也就是obj這個實例,因此需要在上層創建好obj之后,把句柄傳遞給各個被監控組件去raise。
以下為uvm_heartbeat監控兩個組件(compA和compB)的示意圖,uvm_heartbeat模式為UVM_ALL_ACTIVE。第一張圖,在檢查窗口內,compA和compB都有喂狗,檢查通過。第二張圖,在檢查窗口內,只有compB喂狗,compA沒有喂狗,因此檢查失敗,會報出UVM_FATAL。
-
看門狗
+關注
關注
10文章
565瀏覽量
70863 -
仿真器
+關注
關注
14文章
1019瀏覽量
83813 -
計數器
+關注
關注
32文章
2256瀏覽量
94717 -
定時器
+關注
關注
23文章
3251瀏覽量
115021 -
UVM
+關注
關注
0文章
182瀏覽量
19193
發布評論請先 登錄
相關推薦
評論