在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4826|回复: 13

[求助] UVM的重载及main_phase

[复制链接]
发表于 2022-1-17 17:47:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 hillhwchen 于 2022-1-17 17:52 编辑

build_phase重载的env,在main_phase中不被使用。

问题描述:
1.我有一个xx_env1,然后在此基础上扩展xx_env2。
class xx_env2 extend xx_env1;

2.我在base test中实例化xx_env1为env,且在build_phase用env2重载了env1, 设置default sequence在env2下面的sequencer启动没有问题。
set_type_override_by_type(xx_env1::get_type(),xx_env2::get_type());
uvm_config_db#(uvm_object_wrapper)::set(this,"env.2222.sequencer.main_phase","default_sequence", xx_sequence::type_id::get());   //这里重载成功

3.把第2步build_phase的default_sequence删掉改为在main_phase启动。
4.在main_pahse中使用start启动,但这时出现了问题,这里竟然用env1,没有使用env2.
xx_seq.start(env.2222.sequencer);   //这里提示在xx_env1下面没有2222,重载的xx_env2在这没有被用到。


没找到问题点,还望各位指点一下。


发表于 2022-1-17 18:56:51 | 显示全部楼层
你这编译能过吗
发表于 2022-1-17 19:26:32 来自手机 | 显示全部楼层
本帖最后由 eaglezhang01 于 2022-1-17 19:53 编辑

基础问题,extends的时候新定义了一个base 里没有的变量,base handle肯定不能指向这个变量,第一种情况那是你没这么引用,你要是这么引用肯定还是一样的问题
 楼主| 发表于 2022-1-18 08:48:50 | 显示全部楼层
本帖最后由 hillhwchen 于 2022-1-18 08:52 编辑


eaglezhang01 发表于 2022-1-17 19:26
基础问题,extends的时候新定义了一个base 里没有的变量,base handle肯定不能指向这个变量,第一种情况那 ...


第一种情况,我的env2里面的东西都是正常run的,结果是正常的,证明重载是没问题的。所以config_db里面的路径可以使用,但为什么第二种情况就不行?
那我怎样才能在main_phase使用重载后的env2?

 楼主| 发表于 2022-1-18 08:54:01 | 显示全部楼层


uu_chasel 发表于 2022-1-17 18:56
你这编译能过吗


第一种情况没有问题,结果是预期的。
发表于 2022-1-18 09:58:59 来自手机 | 显示全部楼层


hillhwchen 发表于 2022-1-18 08:48
第一种情况,我的env2里面的东西都是正常run的,结果是正常的,证明重载是没问题的。所以config_db里面的 ...


第一种可以是因为你确实有例化2222这个class啊,他是真实存在的,只是你不能用env1的handle去引用,第二种你可以这样: env2 env2_inst;$cast(env2_inst,env);然后在你启动seq的那个把那个env替换为env2_ins,这样就可以了,严格来说你这个都不算是重载,叫重写好一些,重载主要是针对task和function的修改,
 楼主| 发表于 2022-1-18 15:02:55 | 显示全部楼层


eaglezhang01 发表于 2022-1-18 09:58
第一种可以是因为你确实有例化2222这个class啊,他是真实存在的,只是你不能用env1的handle去引用,第二 ...


非常感谢解答,可能我理解有一些错误,还请指正:
build_phase这里的
set_type_override_by_type(xx_env1::get_type(),xx_env2::get_type());    //这里应该是用env2重载了env1的实例env,理解是否正确?
uvm_config_db#(uvm_object_wrapper)::set(this,"env.2222.sequencer.main_phase","default_sequence", xx_sequence::type_id::get());   //env.2222 这个env原来是env1,但有上面的指令,所以指向了env2,env2下面有2222所以可以正常使用。 这里的“env.2222.” 和main_phase的.start(env.2222.sequencer)的env.2222有什么区别?



发表于 2022-1-18 15:34:00 | 显示全部楼层
set_type_override_by_type(xx_env1::get_type(),xx_env2::get_type());
这个东西就是添加了一条记录,当使用factory创建env1的时候会去检查这些记录,如果查到了这个记录那么就会使用env2来创建,并交给env1的句柄。简单来说就是做了一个记录,重载的过程是factory实现的。

uvm_config_db#(uvm_object_wrapper)::set(this,"env.2222.sequencer.main_phase","default_sequence", xx_sequence::type_id::get());
这个也是传递出去了一条信息,信息的索引是"this.env.2222.sequencer.main_phase.default_sequence",信息的内容就是seq_type。在env2.2222.sequencer启动的时候就会用相同索引去查找,查到这条记录就会使用config_db提供的seq_type去创建default_seq,这样你的default seq就能动起来了。实际configdb这里只是一条记录,并不会去检查你有没有这个东西,所以使用起来是安全的

main_phase的.start(env.2222.sequencer)
这个东西肯定是编译不过的,这是语法错误,因为你的env是用env1声明的,这个是env2的父类,没有2222这个东西,编译检查就无法通过。采用楼上提供的cast方式是可以规避这个问题的,毕竟你知道这个env是可以转换为env2,而env2的类型就包含2222了,这样就好了
发表于 2022-1-18 16:44:12 来自手机 | 显示全部楼层


hillhwchen 发表于 2022-1-18 15:02
非常感谢解答,可能我理解有一些错误,还请指正:
build_phase这里的
set_type_override_by_type(xx_env1 ...


其实这个问题抛开现象看本质的答案我已经说了,你现在的困惑如果对factory机制和uvm config db源码有了解的话会很好理解,手机打字很累,给你说关键,你的override语句效果确实是create的时候例化了一个env2类型的实体,config db语句你传入的是env.2222…这样的字符串,注意这里不是引用,不是引用,不是引用,所以没有问题,当在你set的这个sequence的main_phase,会用他的get_full_name()和你set的这个路径进行匹配,你看全程没有之前的env.2222的引用,当然不会有问题
 楼主| 发表于 2022-1-18 16:56:41 | 显示全部楼层


dtyuzhou 发表于 2022-1-18 15:34
set_type_override_by_type(xx_env1::get_type(),xx_env2::get_type());
这个东西就是添加了一条记录,当 ...


非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-6 17:34 , Processed in 0.027750 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表