UVM糖果爱好者教程 - 18.配置数据库(config_db)重访

在文章“配置数据库”中,我们查看了jelly_bean验证环境的配置流程。我们还查看了配置数据库中的配置流程做了哪些幕后工作。本文将重点介绍访问配置数据库的语法和语义。在配置中,我们使用配置数据库存储并检索了jelly_bean_if,jelly_bean_env_config和jelly_bean_agent_config。下图显示了左侧配置中使用的组件层次结构和右侧配置数据库(显示为云朵状)。中间显示访问数据库的代码片段。


                                                                            访问config db

存储jelly_bean_env_config

让我们先看看如何存储和检索jb_env_cfg(在图中以灰色显示),因为这可能是最容易理解的。 jelly_bean_base_test调用set()函数将jb_env_cfg存储在数据库中,如下所示。
uvm_config_db#( jelly_bean_env_config )::set( .cntxt( this ), .inst_name( "*" ), 
                                              .field_name( "jb_env_cfg" ), .value( jb_env_cfg ) )

uvm_config_db是一个参数化的类。在上面的代码中,uvm_config_db专用于jelly_bean_env_config类型。 cntxt(context)和inst_name(instance name)用于在数据库中创建作用域。范围是通过连接上下文的全名和实例名称({cntxt.get_full_name(),“.”,inst_name})创建的。在上面的例子中,范围是{this.get_full_name(),“.”,“*”},它被评估为“uvm_test_top.*”。请注意,当在顶层模块(顶部)中调用run_test()任务时,jelly_bean_base_test的全名将被分配为“uvm_test_top”。还要注意,“*”是与任何组件匹配的通配符。 jb_env_cfg的对象句柄以名称“jb_env_cfg”存储。下图概念性地显示了jb_env_cfg在数据库中的标记方式。


                                                jb_env_cfg 存储在config db

获取jelly_bean_env_config

jb_env调用get()函数从数据库中检索jb_env_cfg,如下所示。

uvm_config_db#( jelly_bean_env_config )::get( .cntxt( this ), .inst_name( "" ), 
                                              .field_name( "jb_env_cfg" ), .value( jb_env_cfg ) )

get()函数参数的含义与set()函数的含义相同。与set()函数类似,作用域被定义为{cntxt.get_full_name(),“.”,inst_name}。在上面的代码中,作用域被评估为“uvm_test_top.jb_env”。通常使用这个作为cntxt和“”作为inst_name。请注意,如果inst_name为空(“”),则点(“.”)也会被忽略。 get()函数搜索数据库并尝试查找与类型,范围和field_name匹配的对象。由于jb_env_cfg的范围在数据库中被定义为“uvm_test_top.*”,所以作用域“uvm_test_top.jb_env”成功匹配它。

存储jelly_bean_agent_config

现在我们来看另一个例子。这一次,jb_env存储jb_agent_cfg,然后jb_agent1检索它(在顶部的图中以橙色显示)。 jb_env调用set()函数将jb_agent_cfg存储在数据库中,如下所示。

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类型。该对象的范围是{this.get_full_name(),“.”,“jb_agent1 *”},它的计算结果为“uvm_test_top.jb_env.jb_agent1 *”。请注意,此范围与jb_agent1及其下的任何组件匹配。 jb_env_cfg.jb_agent_cfg1以名称“jb_agent_cfg”存储。下图概念性地显示了jb_agent_cfg1在数据库中的标记方式。


                                    jb_agent_cfg1存储在config db

获取jelly_bean_agent_config

jb_agent1调用get()函数来检索jb_agent_cfg1,如下所示。

uvm_config_db#( jelly_bean_agent_config )::get( .cntxt( this ), .inst_name( "" ), 
                                                .field_name( "jb_agent_cfg" ), .value( jb_agent_cfg ) )

范围是{this.get_full_name(),“.”,“”},它被评估为“uvm_test_top.jb_env.jb_agent1”。由于数据库中jb_agent_cfg1的作用域为“uvm_test_top.jb_env.jb_agent1 *”,因此它成功地匹配由此get()函数定义的作用域。

存储jelly_bean_if

让我们看看最后一个例子。顶层模块存储一个虚拟接口(顶部图中以黄色显示)。顶层模块调用set()函数如下。

uvm_config_db#( virtual jelly_bean_if )::set( .cntxt( null ), .inst_name( "uvm_test_top" ), 
                                              .field_name( "jb_if1" ), .value( jb_if1 ) )
这里需要注意两点。首先是我们使用null作为cntxt。这是因为顶级模块不是uvm_component,并且无法通过调用get_full_name()来获取其全名。第二个是我们使用“uvm_test_top”作为inst_name。正如我们所看到的,“uvm_test_top”是顶级测试组件的全名。因此,使用这个名称作为范围的一部分非常重要。

如果cntxt为空,则作用域仅由inst_name组成,即“uvm_test_top”。下图概念性地显示了jb_if1在数据库中的标记方式。


                                                       jb_if1 存储在config db

获取jelly_bean_if

jelly_bean_base_test调用get()函数来检索jb_if1,如下所示。

uvm_config_db#( virtual jelly_bean_if )::get( .cntxt( this ), .inst_name( "" ), 
                                              .field_name( "jb_if1" ), .value( jb_agent_cfg1.jb_if ) )

范围是{this.get_full_name(),“.”,“”},它被评估为“uvm_test_top”(如果inst_name为“”,则不包括“.”)。由于数据库中jb_if1的范围是“uvm_test_top”,因此它成功地匹配了由此get()函数定义的范围。

scopes总结

下面的表格总结了哪些组件与我们的示例中定义的范围匹配,前提是get()函数将此用作cntxt,将“”用作inst_name。请注意,范围“uvm_test_top。*”与uvm_test_top下的任何组件匹配,但与范围“uvm_test_top”(1)不匹配。另一方面,范围“uvm_test_top”仅与“uvm_test_top”匹配。它与uvm_test_top(2)下的任何组件不匹配。

Component/Scopeuvm_test_top.*uvm_test_top.jb_env.jb_agent1*uvm_test_top
jelly_bean_base_test (uvm_test_top)cross (1)crosstick (2)
uvm_test_top.jb_envtickcrosscross
uvm_test_top.jb_env.jb_agent1ticktickcross
uvm_test_top.jb_env.jb_agent2tickcrosscross

我希望这篇文章有助于理解如何访问配置数据库。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值