field_automation機制1-field automation的功能及使用(該篇不涉及UVM源碼)


資料來源

(1) UVM實戰-張強;

1.field automation機制常見宏(與常見變量/動態數組/靜態數組/隊列/關聯數組相關宏)

1.1與常見變量相關的uvm_field系列宏

注1:該處的FLAG為UVM_ALL_ON等FLAG;

注2:上述宏分別用於要注冊的字段是整數,實數,枚舉類型,直接或間接派生自uvm_object的類型,事件以及字符串;

注3:枚舉類型需要三個參數,分別為枚舉類型,變量,以及FLAG,如下圖所示;

1.2與動態數組有關的uvm_field系列宏

 注1:與動態數組相關的uvm_field系列宏不包含event類型與real類型,並且枚舉類型的數組里只有兩個參數;

1.3與靜態數組有關的uvm_field系列宏

1.4與隊列有關的uvm_field系列宏

1.5與關聯數組有關的uvm_field系列宏

 注1:宏中第一個類型是存儲數據的類型,第二個類型是索引類型,如`uvm_filed_aa_int_string用於聲明存儲的數據是int類型,而其索引是string類型的關聯數組;

2.該機制的功能?

2.1 提供copy,clone,compare,print,pack_bytes等函數,而不需user定義(詳見《UVM實戰》3.3.2)

(1) copy:用於實例的復制;

注1:如果要把某個A實例復制到B實例中,應該使用B.copy(A);在使用此函數前,B實例必須已經使用new函數分配好了內存空間;

(2) clone:用於分配一塊內存空間,並把另一個實例復制到這塊新的內存空間中;

注1:uvm_object中有clone和copy函數,二者的區別在於在使用copy前,目標實例必須已經使用new函數分配好了內存空間,而使用clone函數時,目標實例可以只是一個空指針. clone=new+copy(需要看源碼);

注2: clone函數無法用於uvm_component中,因為一旦使用后,新clone出的類,其parent參數無法指定;雖然uvm_component無法使用clone函數,但是可以使用copy函數,因為在調用copy函數之前,目標實例已經完成了例化,其parent參數已經指定;

(3) compare:用於比較兩個實例是否一樣;

注1:可以使用A.compare(B),也可以使用B.compare(A);當兩者一致時,返回1,否則為0;

(4) pack_bytes(打包):將所有字段打包成byte流;

注1:上圖中調用pack_bytes將tr中所有字段變成byte流放入到動態數組data_q中;

注2:在把所有的字段變成byte流放入data_q中時,字段按照uvm_field系列宏書寫的順序排列;

(5) unpack_bytes(解包):將一個byte流逐一恢復到某個類的實例中;

注1:上圖中使用unpack_bytes函數將data_q中的byte流轉換成tr中的各個字段;

注2:unpack_bytes函數的輸入參數必須是一個動態數組,所以需要先把收集到的、放在data_q中的數據復制到一個動態數組中;

注3:tr中的pload是一個動態數組,在使用前需要指定其大小;

(6) pack:將所有字段打包成bit流;

(7) unpack:將一個bit流逐一恢復到某個類的實例中;

(8) print:用於打印所有的字段;

2.2 提供自動得到使用config_db::set設置的參數的功能.

(1) uvm_config_db::set與uvm_config_db::get函數一般都是成對出現,但是在某些情況下,可以只有set而沒有get語句,即省略get語句.

(2)所謂的特定情況指的是變量使用uvm_field_int注冊,在build_phase中調用super.build_phase(),並且set函數的第三個參數必須要與get函數中變量的名字一致.這種情況下可以省略掉uvm_config_db::get;

2.2.1 uvm_component build_phase(與自動get config相關???需要加深理解)

3.該機制的使用?

3.1 field_automation機制能獨立使用嗎?

(1) field_automation機制的實現不能單獨使用;

(2) `uvm_field_*宏,必須要依賴於factory機制的宏(比如uvm_object_utils_begin, uvm_object_utils_end).

3.2 field_automation中宏與if的結合

 

3.3 uvm_field_*的使用有順序嗎?

由於pack函數與unpack函數對於字段的位置比較敏感,所以在使用時需要注意順序保持一致.

4.該機制中FLAG的靈活使用?

4.1 FLAG的種類

UVM_ALL_ON, UVM_COPY, UVM_NOCOPY...

4.2 什么情況下使用FLAG?

(1)比如transaction中的某些標志位不會被driver發送給DUT,但可以在驗證平台之間流動,驗證平台可以根據這些標志位做判斷以節省時間.對於這些標志位,當然需要使用uvm_field_int進行注冊,這樣在print的時候,可以看到其值;但是由於不需要發送給driver, 可以通過使用FLAG, 不讓其在調用pack與unpack函數時出現,如下所示.

 

(2)示例

注1:在sequence中可以使用`uvm_do_with(tr,{tr.crc_err==1;})產生CRC錯誤的激勵; 

注2:crc_err不需要在pack和unpack操作中出現,但是需要在print操作中出現;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM