項目中的reg_model一般只有一份,set到reg_sequence上,所以多個sequence並行啟動結束的時候,reg model會成為一個共享資源。
uvm_reg_field中的volatile,主要來設置m_check的變量,
m_check,主要用在uvm_reg的mirror task,以及read task,(需要map中配置check_on_read)
uvm_reg_field中的desired,mirrored,m_parent,m_access變量都是local的,繼承類中完全看不到,只能
通過function來得到數據。
m_access,指定field的access policy。
m_written,指定是否是只能被寫入一次的。
reset可以被設置為多種類型的reset的值。
主要function configure。
uvm_reg中的主要變量有,m_locked,由頂層的reg_block調用
m_parent,指向的uvm_reg_block;
m_is_busy,當該reg正在執行frontdoor的讀寫操作時,該信號置 1,避免此時做predict。
m_backdoor,外部設置進去的backdoor的方法。
m_maps[uvm_reg_map],該reg掛載在的map的對象,在default_map,add_reg時,指定。
hdl_pool,以string為索引,uvm_queue為對象,string方便指定RTL,Gate等不同的hdl。
coverage收集信息,m_has_cover,m_cover_on。has_cover表示reg new的時候加入的coverage選項,
cover_on表示當前設置的coverage。主要區別在調用時候,需要的是哪一種的coverage。
reg new的時候,需要設置的是has_cover,new的時候,直接build_coverage。需要頂層調用include_coverage。
reg_block在new的時候,可以設置cover_on,通過set_coverage等function。sample的時候get_coverage。
reg的讀寫前后都有pre/post的hook task。
uvm_reg中最重要的三個task:
read,write,根據path的不同,操作總線或者更新reg_model;內部都是都access control的,只不過backdoor的在自己內部,其他的在predict中。
predict,只是更新reg_model,是一定不會操作總線的。對backdoor和kind為predict_direct的,沒有access control。
predict的kind有四種,predict_write,predict_read,predict_direct,predict
mirror,read操作加一個check函數,所以也會調用predict函數,更新reg model。
path有兩種,frontdoor和backdoor。
所有的frontdoor的操作,根據map_info中的fd信息,啟動sequence或者調用map的讀寫操作。
其他控制model值的task調用關系:
update的時候,write的值是根據regmodel目前的值,來寫進去的,也就是set field的值,write函數其實只是寫入改變了的field。
所有的field都沒有更新時,是不會進行update操作的。
update直接更新reg model內的值,需要檢測此時沒有reg model的frontdoor操作等,即not_busy。
在reg_field中的task中,基本都調用uvm_reg的task,但是read、write根據是否支持individual可能會調用map中的task。
uvm_reg中還有一些hdl_path的function,add_hdl_path_slice,添加到field的path路徑。這些路徑,之后在map中會被集成起來。
形成一個full_name。
uvm_reg_frontdoor,從uvm_reg_sequence繼承而來,本身是一個sequence。
uvm_reg_backdoor,從uvm_object繼承而來,本身就是一個object,其中定義了read、write的原型函數。
uvm_reg_map,auto-predict的設置,影響所有的讀寫操作,自動更新mirror和desired value。
只影響frontdoor,backdoor都是直接調用do_predict函數的。
m_regs_info,所有add到該map中的寄存器的信息,包括access,offset,addr,
m_check_read,影響所有的read操作,mirror操作,mirror value和讀到的值做比較。
m_adapter,m_sequencer,做frontdoor的read和write操作。
m_base_addr,該map的基地址。
m_regs_info,每個加到該map中的寄存器,所有的信息保存在該數據結構中,
在lock或者add_submap的時候,更新map_info中的addr,調用Function Xinit_address_mapX
定義自己的do_bus_write和do_bus_read,
uvm_reg_block,包含類,包含底層的uvm_reg_block,uvm_reg,
default_path,定義自己的hdl_path,
lock,表明當前的model是lock住的,調用function lock_model()
自己的coverage設置,new的時候設置到has_cover,get的時候,得到cover_on。
uvm_reg_sequence,只是實現了調用map中的讀寫操作,不支持burst_read,burst_write,
其中啟動該sequence,需要reg_sequencer,連接一個driver。
或者在sequence中,直接調用已經存在的read,write task,這樣配置的sequence,可以直接由此繼承。
uvm_reg_item,uvm_sequence中的trnasaction類型,定義reg access的方式,包含一個uvm_object類型的extension,可以自定義。
在讀寫時,方式與adapter交互。
uvm_reg_adapter,繼承自uvm_object,從其中設置一個uvm_reg_item,需要實現兩個function,bus2reg和reg2bus。
其中的變量supports_byte_enable, 影響sequence的個數。provides_reponses,影響sequencer和driver之間的交互。
uvm_reg_predictor,當auto_predict關閉的時候,需要例化的component,連接到寄存器的monitor。
在write函數中顯示調用do_predict函數,更新model中的mirror value,此時do_check函數,會根據read_on_check進行調用。
uvm自建的針對reg的sequence,針對普通的reg有:reg_access_seq,reg_bit_bash_seq,reg_hw_reset_seq。
uvm_reg model,主要實現了
1) 增加了對dut的reg進行訪問的方式,可以直接通過reg model進行訪問。傳統的只能是通過sequence,啟動在bus的sequencer上來實現。
2) 方便了對dut reg進行測試的方法,通過build-in sequence來實現。
3) 方便檢測每次的bus讀寫的正確性,通過reg_predictor的方式來實現。
reg prediction的方式有三種,
1) auto_predict,直接通過設置map的auto_predict選項,通過reg model的sequence,reg model都被正確的賦值,
2) explict_predict,即設置map的auto_predict選項,有增加component,reg_predict。這樣不論sequence是由reg model啟動
還是bus agent啟動,不論front door,還是back door,reg model的值都是正確的。
3) passive predict,只有一個reg predict,對back door訪問不敏感。
reg model的集成:
1) 每個subenv集成一個predictor,
2) 每個reg_predictor初始化內部的reg_model,reg_adaptor,analysis port
3) 每個subenv的sequence中,包括對用的reg_model的指針,
4) 頂層的reg_map,初始化agent和sequencer,
reg model的coverage設置,
1) include_coverage,是一個全局性的coverage開關的設置,
2) build_coverage,一般是在configure的時候,初始化model中的變量的函數。
3) has_coverage,在new covergroup的時候,進行選擇,
4) set_coverage和get_coverage,是在sample的時候,進行選擇。
sample方法,在reg的front door訪問之后,自動調用。
sample_values方法,主要實現對field value的采樣,需要自己調用。
reg_model中的值的check:
1) mirror的task,可以直接對一個reg_block或者reg進行檢查。讀DUT的值與當前的mirror值相同,則為uvm_is_ok
2) read_on_check的檢查,對map進行設置,在讀操作的過程中,檢查desired的值與當前讀到的值相同,則為uvm_is_ok。
reg_model的訪問級別:
1) randomize與update,mirror,reset,都可以在reg_block的層級直接調用。
一般可以先對reg_block進行randomize,之后進行update,很多dut的讀寫操作之后,mirror進行檢查。