Q哥在上一篇文章uvm_info高級(jí)技巧(1)中,跟大家聊了如何屏蔽那些刷屏的uvm_info信息。
今天繼續(xù)深挖調(diào)試語(yǔ)句的高級(jí)用法。
1
warning/error/fatal調(diào)試語(yǔ)句
調(diào)試語(yǔ)句除了uvm_info,UVM內(nèi)部根據(jù)問(wèn)題的嚴(yán)重性(severity)由低到高,還引入了uvm_warning/uvm_error/uvm_fatal。
它們也是UVM預(yù)定義的宏,格式跟umv_info很像,只是不再需要設(shè)定啰嗦程度了;因此不能通過(guò)調(diào)整啰嗦容忍等級(jí)來(lái)忽略。
uvm_warning是打印一些警告信息,用來(lái)提醒仿真中的潛在問(wèn)題。雖然這些問(wèn)題暫時(shí)可能沒(méi)什么錯(cuò),但還不能完全忽視。
uvm_error用來(lái)記錄仿真中的錯(cuò)誤,達(dá)到一定數(shù)量,仿真就提前結(jié)束。
uvm_fatal是嚴(yán)重錯(cuò)誤,一旦執(zhí)行到了,仿真就立即提前終結(jié)。
那么問(wèn)題來(lái)了:

當(dāng)我們專門(mén)進(jìn)行異常測(cè)試的時(shí)候,由于施加的激勵(lì)本身就是錯(cuò)誤的,這時(shí)候難免會(huì)觸發(fā)TB里面原先的uvm_error或者uvm_fatal;導(dǎo)致測(cè)試提前終結(jié)。
這些uvm_error或uvm_fatal如果是自己寫(xiě)的,倒是可以通過(guò)打補(bǔ)丁讓它們對(duì)異常測(cè)試case網(wǎng)開(kāi)一面。但如果是其他人寫(xiě)的或者用的VIP,那就有點(diǎn)棘手了。
好在UVM調(diào)試信息機(jī)制已經(jīng)考慮到這個(gè)問(wèn)題了。
在仿真過(guò)程中,UVM內(nèi)部會(huì)記錄每條調(diào)試語(yǔ)句的嚴(yán)重程度。
默認(rèn)情況下,uvm_info語(yǔ)句的嚴(yán)重程度就是UVM_INFO,uvm_error的嚴(yán)重程度就是UVM_ERROR,以此類推。
2
修改調(diào)試語(yǔ)句的嚴(yán)重程度
類似于調(diào)整啰嗦容忍等級(jí),我們可以通過(guò)下面這個(gè)命令行plusargs來(lái)修改調(diào)試語(yǔ)句的嚴(yán)重程度。

這里<comp>和<id>的設(shè)置方法跟uvm_set_verbostity一樣,不再贅述。
<current severity>是當(dāng)前的嚴(yán)重程度,<new severity>是想要改成的嚴(yán)重程度。
例如下面這個(gè)仿真參數(shù),就是把uvm_test_top.env0下面所有子子孫孫組件里msg id為BAD_CRC的uvm_error語(yǔ)句,改成uvm_warning。

對(duì)于msg id是BAD_CRC的uvm_fatal語(yǔ)句,并不受影響。
這個(gè)plusargs不單能把UVM_ERROR變成UVM_INFO,反過(guò)來(lái)也可以把UVM_INFO變成UVM_ERROR,就看大家實(shí)際的需求了。
如果將UVM_ERROR改成UVM_INFO,那么這時(shí)候它的啰嗦程度是什么呢?

答案是UVM_NONE,也就是啰嗦程度最低。
除了命令行plusargs參數(shù),也可以在TB中,通過(guò)component對(duì)象調(diào)用API來(lái)動(dòng)態(tài)修改嚴(yán)重程度(如下圖所示),用法類似于上一篇提到的修改verbosity的API。
下面這兩個(gè)API的區(qū)分在于是否按msg id進(jìn)行過(guò)濾,不再贅述。

3
調(diào)試語(yǔ)句引發(fā)的調(diào)試行為
設(shè)置容忍等級(jí)雖然可以屏蔽啰嗦程度高的uvm_info語(yǔ)句,但是如果想屏蔽啰嗦程度為UVM_NONE的語(yǔ)句呢?
又或者,當(dāng)我們把uvm_fatal/uvm_error改成了uvm_warning/uvm_info以后,仿真雖然沒(méi)有終結(jié),但是這些信息仍在刷屏怎么辦?
別急,聽(tīng)Q哥給大家慢慢道來(lái)。

除了啰嗦程度(verbosity)和嚴(yán)重程度(severity),UVM內(nèi)部為每個(gè)調(diào)試語(yǔ)句都記錄了一個(gè)調(diào)試行為(action),它是一個(gè)多比特的變量,每一比特都代表一種行為,如下圖所示。

action如果有多個(gè)比特為1,就同時(shí)執(zhí)行多項(xiàng)調(diào)試行為;
如果全部為0,就什么都不干,記為UVM_NO_ACTION。
默認(rèn)情況下,調(diào)試語(yǔ)句對(duì)應(yīng)的行為是根據(jù)嚴(yán)重程度決定的,如下圖所示。

4
修改調(diào)試語(yǔ)句的調(diào)試行為
UVM提供了下面的命令行plusargs參數(shù),可以修改調(diào)試語(yǔ)句對(duì)應(yīng)的調(diào)試行為。

這里的<comp>和<id>用法和uvm_set_verbosity及uvm_set_severity一樣。
<severity>是代表調(diào)試語(yǔ)句的嚴(yán)重程度。如果通過(guò)uvm_set_severity修改過(guò)嚴(yán)重程度,那么uvm_set_action會(huì)根據(jù)修改后的嚴(yán)重程度進(jìn)行過(guò)濾。
<action>是執(zhí)行到當(dāng)前調(diào)試語(yǔ)句時(shí)采取的調(diào)試行為。
例如配置下面這個(gè)命令行參數(shù),就可以無(wú)視uvm_test_top.env0下面所有子子孫孫組件中嚴(yán)重程度為UVM_ERROR的所有調(diào)試語(yǔ)句;

也就是說(shuō),既不會(huì)打印信息到屏幕,也不會(huì)計(jì)入錯(cuò)誤個(gè)數(shù)。
相比之前提到的uvm_set_verbosity,uvm_set_action簡(jiǎn)直是大殺器啊!
完全可以通過(guò)修改調(diào)試行為,更直接的屏蔽調(diào)試信息,不必再管什么啰嗦程度和容忍等級(jí)。
uvm_set_action也可以在TB中通過(guò)component對(duì)象調(diào)用API來(lái)實(shí)現(xiàn)(如下圖所示),用法類似于verbosity對(duì)應(yīng)的API,這里不贅述。

總結(jié)
通過(guò)修改調(diào)試語(yǔ)句的嚴(yán)重性和對(duì)應(yīng)的調(diào)試行為,可以避免仿真提前結(jié)束,或者更為直接的屏蔽調(diào)試信息。
但是Q哥需要給大家特別強(qiáng)調(diào)下,修改調(diào)試語(yǔ)句的嚴(yán)重性和調(diào)試行為,屬于掩耳盜鈴顛倒黑白的做法,一定要慎之又慎,避免操作不當(dāng),掩蓋了原本應(yīng)該報(bào)出的錯(cuò)誤。
美好的時(shí)光總是短暫的,今天就跟大家聊到這里。接下來(lái),Q哥將給大家獻(xiàn)上如何定制uvm調(diào)試信息的結(jié)構(gòu),如何打印彩色信息到屏幕上,等等進(jìn)階的uvm調(diào)試技巧使用心得。
敬請(qǐng)期待!
日積月累,進(jìn)步從一點(diǎn)一滴開(kāi)始,加油!!
聽(tīng)Q哥剖析uvm_info高級(jí)技巧(1)--- 如何屏蔽某些刷屏的啰嗦調(diào)試信息