1.什麽是config_db機制:
umv_config_db是從uvm_resource_db派生而來,對uvm_resource_db的一些功能進行了擴展,主要體現在對資源的寫入和讀取上,uvm_resource_db是uvm_object繼承而來的virtual類而已,uvm_resource繼承後增加了個參數化,而uvm_resource_db中定義(typedef)了一個跟其參數一致的參數化的uvm_resource類型rsrc_t。
config_db 是不同component之間共用資源的一種機制,即實現了資源共用(也可描述為在UVM驗證平臺間傳遞參數),又避免了全局變量的弊端。
2.config_db作用?
特殊情況時可以僅出現set,不出現get,在build_phase中調用super.build_phase()即可自動完成get操作(子類繼承父類,所以一般build_phsae中,要加super.build_phase完成頂層配置)。條件:1.被傳參所在的component實例必須使用uvm_component_utils宏註冊。2.被傳參變量必須使用uvm_field_int宏註冊。3.set函數設置時第三個參數必須要與get函數中的變數名字相一致。
1. 省略get的config
config总是set和get成对出现的。在build_phase中,要写上如下的两句话才能把pre_num_max和pre_num_min的值更新为case的设置值:
uvm_config_db#(int)::get(this,””,”pre_num_max”,pre_num_max);
uvm_config_db#(int)::get(this,””,”pre_num_max”,pre_num_min);
这里只有两个变量,尚且还能忍受,如果是有100个变量,那么写上这么100行古怪的语法,那将会是相当痛苦的一件事情。
其实在一些特定的情况下,get是可以省略。super.build_phase(phase);
只有把mac_driver注册到factory时,顺便使用field_automation机制把要get的变量注册,那么当UVM执行到driver的super.build_phase(phase)这句话时,就会自动执行那两个get的语句。这是相当便利的,在前面介绍field_automation机制时,一直是以一个transaction为例子进行介绍的,其实对于派生自uvm_object的类(如transaction)和uvm_component的类(如uvm_driver)中,是都可以使用field_automation机制的。
不过,这里存在一个问题,那就是如果要让super.build_phase(phase)能够自动get到设置的值的话,那么在set的时候,set的第三个参数必须与要get的变量的名字相一致。
如果低層和高層同時向同一地點發送,則高層優先,即在get操作之前,若有兩個set函數已完成,則僅接收傳遞來源UVM層次高的那個參數,即越靠近根節點uvm_top的層次越高,優先順序越高。如果從同一層次向同一目的地發則取最新的。
4.config_db的使用
config_db::set哪些?virtual_intf,cfg类(env_cfg、agt_cfg、scb_cfg、refm_cfg...seq_cfg)、reg_model、default_seq。
~interface的傳遞
interface傳遞可很好解決連接硬件世界和軟件世界。在SV中可通過層次化的interface的索引完成傳遞,但這種方式不利於軟件世界的封裝和複用。UVM的uvm_config_db使得接口的傳遞和獲取徹底分開。實現接口傳遞的過程需注意:1、接口傳遞應發生在run_test()之前,保證在進入build phase之前virtual interface已被傳遞到uvm_config_db中;2、用戶應把interface與virtual interface的聲明區分開,在傳遞過程中的類型應為virtual interface。(在module中可以聲明interface,但是在class類中聲明的是virtual interface)
在uvm驗證環境中在top_tb中set interface,因爲uvm通過run_test 創建的實例脫離了uvm_top的結構層次,建立了一個新的層次,因此需要通過config_db來傳遞;
~ 變量傳遞
在各個test中可以在build phase階段對底層元件中的變量加以配置,進而在環境例化之前完成配置,使環境可以按照預期運行;
比如給agent傳遞變量uvm_active,如果所有的例化均在build_phase中完成,則不需要config_db來傳遞,可以直接賦值,推薦這種方式。
~object傳遞
在test配置中,需要配置的參數不只是數量多,而且可能還分屬於不同元件。若對這麼多層次中的變數做出變數的設置需要更多代碼,易出錯還不易於複用,甚至底層元件的變數被刪除後也無法通過uvm_config_db:set()得知配置是否成功。若將每個元件的變數加以整合,首先放置到uvm_object中再對中心化的配置物件進行傳遞,將會更有利於整體環境的修改維護。
通過default_sequence启动seq
eg:uvm_config_db#(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", case0_sequence::type_id::get());