UVM的寄存器模型,對一個寄存器bit中有兩種數值,mirror值,盡可能的反映DUT中寄存器的值。expected值,盡可能的反映用戶期望的值。
幾種常用的操作:
read/write:可以前門訪問也可以后門訪問,如果在env的頂層定義過uvm_auto_predict(1),則UVM會在這兩個操作后自動調用do_predict函數
來更新寄存器模型中的mirror值。
peek/poke:只用於后門訪問,而且完全不管硬件的行為,如向只讀寄存器寫數據,仍可以寫入。應用很少。會自己更新mirror值和expected值。
get/set:得到或設置寄存器模型的期望值。
update操作:可以使用前門訪問,也可以使用后門訪問,檢查期望值與鏡像值是否一致,如不一致,則向DUT寫入期望值。
通過枚舉結構uvm_path_e來定義。
mirror操作:用於讀取DUT中寄存器的值並將它們更新到寄存器模型中。可以前門訪問也可以后門訪問。兩種的應用場景:1)check選項關閉,
仿真中不斷調用。2)check選項打開,用在結束時,檢查DUT與寄存器模型的值是否相同。
predict操作:人為的根據DUT來更新寄存器模型中的鏡像值。但同時又不對DUT進行任何操作。此時的uvm_path_e是UVM_PREDICT_DIRECT。
可以通過加monitor在寄存器總線上。檢測到uvm_reg_item操作,便通過TLM傳送到uvm_reg_predict模塊來更新mirror值。
函數內部主要有do_predict操作,這是主要的實現函數。還有一個post_predict的回調函數,可以自己擴展根據mirror值更新
期望值。但是pre_predict並不是一個回調函數,僅僅只是一個虛函數原型。可以在do_predict操作之前調用,完成覆蓋率采樣。
由於前門訪問會消耗仿真時間,而后門訪問不會消耗仿真時間,所以在build_phase,connect_phase只能使用后門訪問,所以
uvm_path_e中默認定義有一個UVM_DEFAULT_PATH,這樣就可以在這些phase隱式的指明后門訪問。而在task phase中在
顯式的指明前門訪問。(這時DUT已經開始工作,使用前門訪問比較接近硬件)
一般在config中使用寄存器模型,先set/randomized再update。后門訪問。
