从uvm_resource_db中扩展而来,体现在set()/get()上
class uvm_config_db#(type T=int) extends uvm_resource_db#(T);
set
- static function void set(), static 的function是不能override的。
- systermverilog 支持override(重写),同名函数,同样的参数;但是不支持overload(重载),同名函数,不同参数。
综上,uvm_config_db::set()和uvm_resource_db::set()是没有任何继承继承关系的。
从user的角度来讲,uvm_config_db::set/get是经常用到的。
- 第一个参数是uvm_component,所以一定要特别留心在sequence中参数设定的时候,这里不能是this,必须要是一个uvm_component的类型。
- 其实跟uvm_resource_db:::set()做的事情大同小异。
- 更加关注precedence的属性。
- 如果同一个config多次set的话,set_priority_name()将会根据参数,将rtab中再次set一个config。
static uvm_pool#(string,uvm_resource#(T)) m_rsc[uvm_component];
- pool = m_rsrc[cntxt],m_rsrc对应的是一个联合数组,索引是iuvm_component,内容是uvm_pool
- 每一个uvm_component对应一个uvm_pool,uvm_component其实就是对应的set的第一个参数。
- 当同一个uvm_component对应多次set的时候,会将前一次的给覆盖掉。
get()
- 第一个参数是uvm_component的类型!!!
- lookup_regex_names:从rtab中查找是否有与输入的name对应的记录。
- set是将所有的scope/name放到了一个全局唯一的uvm_reosurce_pool里面,然后根据path+field_name去
uvm_resource_pool这个唯一的池子里面来寻找。举个例子:
这个时候在uvm_resource_pool的池子里面应该是可以找到两条scope:uvm_test_top.env.i_agt.drv name:pre_num的记录,唯一不同的是precedence不同,这里采用的是高值优先的原则。也就是靠近top层具有较高的权限。 - get_higest_precedence():查找max的precedence。
- read(),return value
在这里有一个例外就是,在一些情况下,可以不使用get,而可以自动获取值。