uvm_config_db

从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这个唯一的池子里面来寻找。举个例子:
    image.png

    这个时候在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,而可以自动获取值。

你可能感兴趣的:(uvm_config_db)