天天看點

《UVM實戰》——3.3節field automation機制

本節書摘來自華章社群《uvm實戰》一書中的第3章,第3.3節field automation機制,作者 張 強,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.3 field automation機制

3.3.1 field automation機制相關的宏

在第2章介紹filed_automation機制時出現了uvm_field系列宏,這裡系統地把它們介紹一下。最簡單的uvm_field系列宏有如下幾種:

代碼清單 3-25

來源:uvm源代碼

這裡一共出現了15種。聯合數組有兩大識别标志,一是索引的類型,二是存儲資料的類型。在這一系列uvm_field系列宏中,出現的第一個類型是存儲資料類型,第二個類型是索引類型,如uvm_field_aa_int_string用于聲明那些存儲的資料是int,而其索引是string類型的聯合數組。

3.3.2 field automation機制的常用函數

field automation功能非常強大,它主要提供了如下函數。

copy函數用于執行個體的複制,其原型為:

代碼清單 3-31

它的使用方式可以參考3.1.6節。

除了上述函數之外,field automation機制還提供自動得到使用config_db::set設定的參數的功能,這點請參照3.5.3節。

3.3.3 field automation機制中标志位的使用

考慮實作這樣一種功能:給dut施加一種crc錯誤的異常激勵。實作這個功能的一種方法是在my_transaction中添加一個crc_err的标志位:

代碼清單 3-40

在這個17bit的數字中,bit0表示copy,bit1表示no_copy,bit2表示compare,bit3表示no_compare,bit4表示print,bit5表示no_print,bit6表示record,bit7表示no_record,bit8表示pack,bit9表示no_pack。剩餘的7bit則另有它用,這裡不做讨論。uvm_all_on的值是'b000000101010101,表示打開copy、compare、print、record、pack功能。record功能是uvm提供的另外一個功能,但是其應用并不多,是以在上節中并沒有介紹。uvm_all_on | uvm_nopack的結果就是'b000001101010101。這樣uvm在執行pack操作時,首先檢查bit9,發現其為1,直接忽略bit8所代表的uvm_pack。

除了uvm_nopack之後,還有uvm_nocompare、uvm_noprint、uvm_norecord、uvm_nocopy等選項,分别對應compare、print、record、copy等功能。

3.3.4 field automation中宏與if的結合

在以太網中,有一種幀是vlan幀,這種幀是在普通以太網幀基礎上擴充而來的。而且并不是所有的以太網幀都是vlan幀,如果一個幀是vlan幀,那麼其中就會有vlan_id等字段(具體可以詳見以太網的相關協定),否則不會有這些字段。類似vlan_id等字段是屬于幀結構的一部分,但是這個字段可能有,也可能沒有。由于讀者已經習慣了使用uvm_field系列宏來進行pack和unpack操作,那麼很直覺的想法是使用動态數組的形式來實作:

代碼清單 3-44

使用這種方式的vlan幀,在執行print操作時,4個字段的資訊将會非常明顯;在調用compare函數時,如果兩個transaction不同,将會更加明确地指明是哪個字段不一樣。