UVM糖果爱好者教程 - 13. 配置数据库(uvm_config_db)

这篇文章将解释配置数据库(uvm_config_db)是如何工作的。 在配置类中,我们使用uvm_config_db来存储jelly_bean_if,jelly_bean_env_config和两个jelly_bean_agent_configs。 这篇文章将分析配置数据如何存储和检索。 下面显示了与配置数据库相关的类图。 请注意,为了避免混乱,我们只显示了与jelly_bean_if和jelly_bean_agent_config相关的类。 UVM标准库类以粉色显示,而专用于jelly_bean_transaction类型的UVM类以黄色显示。


                                        uvm_config_db相关类图

设置虚拟接口

在配置中,顶层模块将两个虚拟接口(jb_if1和jb_if2)存储到配置数据库中,如下所示:

uvm_config_db#( virtual jelly_bean_if )::set( .cntxt     ( null     ), 
                                              .inst_name ( ""       ),
                                              .field_name( "jb_if1" ),
                                              .value     (  jb_if1  ) );
uvm_config_db#( virtual jelly_bean_if )::set( .cntxt     ( null     ), 
                                              .inst_name ( ""       ),
                                              .field_name( "jb_if2" ),
                                              .value     (  jb_if2  ) );

下图显示了这些设置函数被调用后将创建的内容。


这是涉及的步骤。

  1. 由于top是一个模块,而不是uvm_component,所以在调用set方法时,null会作为cntxt传递。在这种情况下,uvm_top是uvm_root类的单例对象,将用作cntxt。
  2. 如果此条目不存在,则使用cntxt对象作为关键字创建关联数组(m_​​rsc)的条目。
  3. 关联数组的入口指向一个uvm_pool,它有另一个关联数组(池)。
  4. 使用inst_name和field_name作为关键字(lookup)创建关联数组的条目。请注意,在创建查找时,inst_name和field_name与一个字符串(“__M_UVM__”)拼接在一起。
  5. 如果查找不存在,则创建一个uvm_resource对象。如果inst_name为“”,则作为范围存储cntxt的全名,即“uvm_test_top”。传递给set()函数的值也被存储。
  6. uvm_resource对象的句柄存储在两种uvm_queue中。第一种队列将句柄存储到具有公共field_name的uvm_resource对象。为每个唯一的field_name创建一个uvm_queue。在我们的例子中,创建了两个uvm_queue;一个用于“jb_if1”,另一个用于“jb_if2”。
  7. 第二种队列将句柄存储到具有公共类型的uvm_resource对象。为每个唯一类型创建一个uvm_queue。在我们的例子中,为虚拟jelly_bean_if类型创建了一个uvm_queue。
  8. 队列在单例uvm_resource_pool中注册。 uvm_resouce_pool有两个关联数组。一个数组(rtab)使用field_name作为键。
  9. 另一个数组(ttab)使用uvm_resource的类型作为键。

获取虚拟接口

在配置中,jelly_bean_base_test如下检索jelly_bean_ifs:


这是所涉及的步骤。

  1. 以field_name为关键字查找uvm_resource_pool的名称表。
  2. 如果名称匹配,则获取uvm_queue的句柄。
  3. 遍历队列的条目。
  4. 如果对象的作用域和类型相匹配,则将uvm_resource存储在新创建的uvm_queue中。
  5. 检索具有最高优先级的uvm_resource。
  6. 资源的值被返回。

设置Agent配置

现在我们来看另一个例子。 在配置中,jelly_bean_env按如下方式存储jelly-bean-agent配置(jb_agent_cfg1和jb_agent_cfg2):

uvm_config_db#( jelly_bean_agent_config )::set( .cntxt     ( this           ), 
                                                .inst_name ( "jb_agent1*"   ),
                                                .field_name( "jb_agent_cfg" ),
                                                .value( jb_env_cfg.jb_agent_cfg1 ) );
uvm_config_db#( jelly_bean_agent_config )::set( .cntxt     ( this           ), 
                                                .inst_name ( "jb_agent2*"   ),
                                                .field_name( "jb_agent_cfg" ),
                                                .value( jb_env_cfg.jb_agent_cfg2 ) );

下图显示了这些设置函数被调用后将创建的内容。


这是所涉及的步骤。

  1. jelly_bean_env使用此(jb_env)作为cntxt调用set()函数。
  2. 如果此条目不存在,则使用cntxt对象作为关键字创建关联数组(m_​​rsc)的条目。
  3. 关联数组的入口指向一个uvm_pool,它有另一个关联数组(池)。
  4. 使用inst_name和field_name作为关键字(lookup)创建关联数组的条目。请注意,在创建查找时,inst_name和field_name与一个字符串(“__M_UVM__”)拼接在一起。
  5. 如果查找不存在,则创建一个uvm_resource对象。与虚拟接口的情况不同,这次inst_name不是“”。在这种情况下,与inst_name连接的cntxt对象的全名将作为范围存储。传递给set()函数的值也被存储。
  6. uvm_resource对象的句柄存储在两种uvm_queue中。第一种队列将句柄存储到具有公共field_name的uvm_resource对象。为每个唯一的field_name创建一个uvm_queue。在我们的例子中,为“jb_agent_cfg”创建了一个uvm_queue。
  7. 第二种队列将句柄存储到具有公共类型的uvm_resource对象。为每个唯一类型创建一个uvm_queue。在我们的例子中,为jelly_bean_agent_config类型创建了一个uvm_queue。
  8. 队列在单例uvm_resource_pool中注册。 uvm_resouce_pool有两个关联数组。一个数组(rtab)使用field_name作为键。
  9. 另一个数组(ttab)使用uvm_resource的类型作为键。

与前面的示例不同之处在于rtab只有一个条目,因为uvm_agent_cfg1和uvm_agent_cfg2使用相同的field_name(“uvm_agent_cfg”)。

获取Agent配置

在配置中,jelly_bean_agent检索了jb_agent_cfg,如下所示:
uvm_config_db#( jelly_bean_agent_config )::get( .cntxt     ( this           ), 
                                                .inst_name ( ""             ), 
                                                .field_name( "jb_agent_cfg" ),
                                                .value     (  jb_agent_cfg  ) );

下图显示了如何检索jb_agent_cfg。


这是所涉及的步骤。

  1. 以field_name为关键字查找uvm_resource_pool的名称表。
  2. 如果名称匹配,则获取uvm_queue的句柄。
  3. 遍历队列的条目。
  4. 如果对象的作用域和类型相匹配,则将uvm_resource存储在新创建的uvm_queue中。 请注意,有两个uvm_resource对象,但它们的作用域不同。 传递给get()函数的cntxt对象的全名在两者之间进行区分。
  5. 检索具有最高优先级的uvm_resource。
  6. 资源的值被返回。

总结

这是关于配置数据库。 此图显示了本文中涉及的主要对象。 我希望这篇文章能帮助你理解配置数据库的工作原理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值