UVM从入门到崩溃boom!之第七章:如何在build_phase中利用UVM configuration机制传递config类

小弟刚开始学UVM欢迎大家批评!部分图片来自网络,侵权请联系qq:1530547890删除谢谢!

第七章:如何在build_phase中利用UVM configuration机制传递config类

问题1:testcase层为什么需要object化最高层次的config类,而其他层只需handle该层的config类?
问题2:为什么有声明config类handle的层get之后使用资源时,不需要事先定义资源?没有声明config类的层get之后使用资源时,需要事先定义资源(比如driver层)?
问题3:testcase层中怎么给config类中的资源值:变量值和virtual interface赋值?
1、如何配置config类
(1)、针对同一个组件的所有配置项打包成一个配置对象,称之为config类(class),config类均扩展于uvm_object;如下图:
i、最上层的config类m_env_cfg的配置有int类型的is_coverage、is_check变量,以及其包含的config类m_agent_cfg;
ii、下面一层config类m_agent_cfg包含枚举类型变量is_active,int类型变量pad_cycles,还有要传给下级组件的virtual interface;
在这里插入图片描述
(2)、这两个config类的编写:
i、config类均扩展于uvm_object
ii、高层次config类的变量声明除了本层次需要用到的配置变量之外,还需要handle化其包含的低层次config类,构造函数中必须包括其包含的低层次的config类的实例化
iii、将所有层次的config和所有变量注册到field automation以便使用机制内函数对其进行操作
高层次config类:env_config,在testcase层被object化成m_env_cfg,与此同时下一层次config类agent_config被object化成m_agent_cfg。
在这里插入图片描述
下一层次的config类 :agent_config,在env_config被实例化同时也被实例化
在这里插入图片描述
2、如何使用config类
(1)、两个函数:一般在build_phase中调用,top层除外(initial块中)
uvm_config_db#(资源类型)::set(配置资源的组件,”目标组件句柄”,”资源ID”,资源值)
uvm_config_db#(资源类型)::get(获取资源的组件,”目标组件句柄”,”资源ID”,目标)
其中:
i、set可以传递两类资源:子config类、config类中的资源值(包含变量值和virtual interface)
ii、同理get可以得到两类资源:从上层传来的config类(相对于上层就是上层的子config类)、config类中的资源值(包含变量值和virtual interface)
iii、set可以看作是将object化的config类传递给”资源ID”,get可以看作是从”资源ID”里拿资源并shadow copy给handle或者是直接copy给object!
在这里插入图片描述
在这里插入图片描述
2、各个层次中与configuration机制对应的操作(shadow copy猜想):
在这里插入图片描述
(1)、testcase层
i、handle并object化最高层次的config类(m_env_cfg),相当于同时object化其下所有的config类(m_agent_cfg);区别于下层,testcase层要实例化最高层次config类,用于给object化的config类配置资源值,下层由于不需要配置资源值,所以只需声明handle即可;
ii、通过config路径配置已经被object化的最高层次的config类中的所有资源(is_coverage、is_check、is_active、pad_cycles); iii、使用get函数从top层得到资源virtual interface封装到已经object化的最高层次的config类里的对应virtual interface(m_vif);
iv、使用set函数将已经object化的config类(m_env_cfg)传递给“资源ID”;
v、注意要先get和先设置资源值之后再set,为了将所有资源配置好了之后再打包发送给下级;
在这里插入图片描述
(2)、env层
i、handle化该层的config类(m_env_cfg),使用get函数从testcase层拿已经被testcase配置好资源的config类(env_cfg,注意资源ID匹配,get函数利用shadow copy将这个object复制给该层的config类句柄)。所以该层可以使用config类中的资源值(这里指的是is_coverage和is_check变量);
ii、使用set函数将已经object化的config类(m_agent_cfg)传递给“资源ID”;
iii、注意要先get和先设置资源值之后再set,为了将所有资源配置好了之后再打包发送给下级;
iv、对比driver层,该层的资源(变量和virtual interface)都被复制到该层的config类句柄m_env_cfg中,所以可以直接对这些资源进行利用或者set操作;
在这里插入图片描述
(3)、agent层:
i、handle化该层的config类(m_agent_cfg),使用get函数从env层拿已经被testcase配置好资源的config类(m_agent_cfg,注意资源ID匹配,get函数利用shadow copy将这个object复制给该层的config类句柄)。所以该层可以使用config类中的资源值(这里指的是is_active);
ii、使用set函数将已经object化的config类(m_agent_cfg)中的资源传递给“资源ID”;
(这里指的是资源的配置值pad_cycles和virtual interface m_vif);
iii、注意要先get和先设置资源值之后再set,为了将所有资源配置好了之后再打包发送给下级;
iv、对比driver层,该层的资源(变量和virtual interface)都被复制到该层的config类句柄m_env_cfg中,所以可以直接对这些资源进行利用或者set操作;
在这里插入图片描述
在这里插入图片描述
(4)、driver层:
i、使用get函数从agent层拿到已经被teastcase配置好资源的属于该层的资源值(这里指的是pad_cycles变量和virtual interface),由于该层没有config类用于封装这些资源值,所以需要先定义资源之后(virtual interface和pad_cycles)才可以使用它们;
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值