uvm中config_db機制

1.什麽是config_db機制: 

umv_config_db是從uvm_resource_db派生而來,uvm_resource_db的一些功能進行了擴展,主要體現在對資源的寫入和讀取上,uvm_resource_dbuvm_object繼承而來的virtual類而已,uvm_resource繼承後增加了個參數化,而uvm_resource_db中定義(typedef)了一個跟其參數一致的參數化的uvm_resource類型rsrc_t

config_db 是不同component之間共用資源的一種機制,即實現了資源共用(也可描述為在UVM驗證平臺間傳遞參數),又避免了全局變量的弊端。

2.config_db作用?

~傳遞 virtual interface 到環境中;
~設置單一變數值, 例如 int string enum 等;
~傳遞配置物件( config object )到環境;
3.格式:
uvm_config_db#(T)::set(uvm_component cntxt, string inst_name, string field_name, T value);——一般從頂層環境來;
uvm_config_db#(T)::get(uvm_component cntxt, string inst_name, string field_name, T value)——從底層環境得到;’
第一個參數uvm_component contxt 和string inst_name構成目標路徑,一般用“this”表示,第三個參數為實例名字,第四個為要設置的值;
如果第一個參數為null,則與uvm_root::get()等價,即uvm_top,則第二個參數的開始路徑為uvm_test_top;比如 top_tb 中使用 config _ db 機制來設置 vif 的時候,由於 top _ tb 一個類,沒辦法使用 this 指針,因此第一個參數使用 null ,第二個參數使用絕對路徑 uvm _test_top.xxx;

特殊情況時可以僅出現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的索引完成傳遞,但這種方式不利於軟件世界的封裝和複用。UVMuvm_config_db使得接口的傳遞和獲取徹底分開。實現接口傳遞的過程需注意:1、接口傳遞應發生在run_test()之前,保證在進入build phase之前virtual interface已被傳遞到uvm_config_db2、用戶應把interfacevirtual 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());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值