uvm环境中对uvm_config_db的理解

uvm_config_db的用途大概有如下三种:

传递virtual interface到环境中。

设置单一变量值,如int.string.enum等。

传递配置对象(config object)到环境中

 

 

在使用uvm_config_db的配置方法时,下面给出一些建议:

·         在使用set/get方法时,传递的参数类型应当上下保持一致。对于uvm_object等实例的传递,如果get类型与set类型不一致,应当首先通过$cast()完成类型转换,再对类型转换后的对象进行操作。

·         set/get方法传递的参数可以使用通配符“*”来表示任意的层次,类似于正则表达式的用法。同时,用户需要懂得“*.comp1”与“*comp1”的区别,前者表示在目前层次之下所有名字为“comp1”的组件,而后者表示包括当前层次及当前层次以下的所有名为“comp1”的组件。

·         在module环境中如果要使用uvm_config_db::set,则传递的第一个参数uvm_component cntxt用来表示当前的层次,由于当前层次为最高层,所以用户可以设置为null,也可以设置为uvm_root::get()来表示uvm_root的全局实例。

·         在使用被配置变量时,应当确保先进行了uvm_config_db::get的操作,获得了正确的值以后再使用。

·         应当尽量确保uvm_config_db::set方法在其相关配置组件创建前调用。这是因为只有先进行了配置,其相关组件在例化时进入build phase,可以得到期望的值。

·         对于同一实例组件的同一个变量,如果有多个上层组件对该变量进行设置时,更上层组件的配置会覆盖低层的配置;但是如果是同一个层次组件对该变量进行多次配置时,应该遵循后面的配置会覆盖前面的配置。

·         用户应该在使用uvm_config_db::get()方法时,添加便于调试的语句,来通过UVM信息打印得知get方法的变量是否从uvm_config_db获取,如果没有获取,是否需要采取其它的措施。

 

 

从上面这个例子可以看到,接口的传递从硬件世界到UVM环境中的传递可以通过uvm_config_db来实现。在实现过程中需要注意几点:

·         接口的传递应该发生在run_test()之前。这保证了在进入build phase之前,virtual interface已经传递进入uvm_config_db中。

·         用户应当把interface与virtual interface的声明区分开来。在传递过程中的类型应当为virtual interface,即实际接口的句柄。

           在使用uvm_config_db API set/get时,实际发生了如下的后台操作:

1.     uvm_config_db::set通过层次和变量名,将这些信息放置到uvm_pkg唯一的全局变量uvm_pkg::uvm_resources。

2.     全局变量uvm_resources用来存储和释放配置资源信息(resource information)。uvm_resources是uvm_resource_pool类的全局唯一实例,该实例中有两个resource数组用来存放配置信息,这两个数组中一个由层次名字索引,一个由类型索引,通过这两个关联数组可以存放任意个通过层次配置的信息。同时,底层的组件也可以通过层次或者类型来取得高层的配置信息。这种方式也完成了信息配置与信息获取的剥离,便于调试和复用。

3.     在使用uvm_config_db::get方法时,通过传递的参数构成索引的层次,然后在uvm_resource已有的配置信息池中索引该配置,如果索引到,方法返回1,否则为0。

 

 

如何使用?

 

uvm_config_db#(int)::set(this, “env.i_agt.drv”, “pre_num”, 100);

 

四个参数,set寄信,get收信。

 

第一个和第二个参数联合起来组成目标路径,与此路径符合的目标才能收信。第一个参数必须是一个uvm_component实例的指针,第二个参数是相对此实例的路径。第三个参数表示一个记号,用以说明这个值是传给目标中的哪个成员的,第四个参数是要设置的值。

 

uvm_config_db#(int)::get(this, “”, “pre_num”, pre_num);

 

四个参数中,第一个参数,通常可以为 "this", "null"等实例的指针。

第二个参数,可以为空“”, 也可以用通配符,如截图中的例子,”*yy_agent" "yy_agent.drv"

set 与get的第一个到第三个参数“寄信”与“收信”要符合两个条件:时间的匹配,一定是先寄信再收信,为了避免出错,一般get前最好加判断,2 标记一致,也就是邮件目的地是匹配的。

第三个,往往是个参数值,或者说句柄。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值