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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

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

[求助] UVM factory create_component_by_name

[复制链接]
发表于 2022-3-30 17:21:09 | 显示全部楼层 |阅读模式

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

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

x
在uvm的框架中,test_case的例化是在uvm_root上实施的,查看源代码是用create_component_by_name来实现的。
image.png

但是我始终没有找到在哪里显示调用了factory的register函数,尽管注释告诉我用`uvm_component_utils(T)注释以后就可以实现register功能,但我觉得这个宏就只是定义了几个函数而已,并没有实际的调用。
image.png image.png

后来发现我之前遗漏了一个关键的知识点,就是static修饰的function会在initial之前自动调用,并不需要显示调用,所以type_id.get_type()会自动调用。当然你也可以显示调用。

不知道我理解的对不对?希望各位大佬批评指正。

特别感谢B站up主的分享:https://space.bilibili.com/353295403/?spm_id_from=333.999.0.0
发表于 2022-3-30 18:18:02 来自手机 | 显示全部楼层
黑色字体明显不对,一个函数我都没调会自动调,感觉遇到了幽灵^-^,实际上get函数不是在你说的get_type里调的,而是在468行这个class里的声明语句中调的
 楼主| 发表于 2022-3-31 09:22:26 | 显示全部楼层


eaglezhang01 发表于 2022-3-30 18:18
黑色字体明显不对,一个函数我都没调会自动调,感觉遇到了幽灵^-^,实际上get函数不是在你说的get_type里调 ...


哈哈哈,我之前也觉得static function的这个用法有点奇怪,但是在我写过一个小例子之后,我发现确实是自动调用的。

image.png image.png
从打印结果来看,new_bird确实是在initial语句之前自动调用的。


具体例子参考:https://www.jianshu.com/p/dc39a62116ad
当然这是我的理解。

大佬说my_case在uvm_root一层用create_component_by_name调用的时候,我确实翻了一下源代码没有找到显示调用到register的地方。






发表于 2022-3-31 10:02:54 来自手机 | 显示全部楼层


许晴125 发表于 2022-3-31 09:22
哈哈哈,我之前也觉得static function的这个用法有点奇怪,但是在我写过一个小例子之后,我发现确实是自 ...


你仔细看你代码第2行,是不是调了get函数,如果不调这个函数你看下效果呢,静态的东西确实是在initial语句之前就会ready,实际编译分为两步:一步是语法检查,第二步是elaboration,静态的东西应该就是在第二步准备好的,所以先于initial,但这得不出函数就是自动调的结论,另外是你昨天说那个链接随便看了下他关于function调task的结论也是错的,这个我之前在论坛里有回复过
 楼主| 发表于 2022-3-31 10:22:06 | 显示全部楼层


eaglezhang01 发表于 2022-3-31 10:02
你仔细看你代码第2行,是不是调了get函数,如果不调这个函数你看下效果呢,静态的东西确实是在initial语 ...


image.png

大佬,在top层我并没有调用任何bird的东西,但是从打印结果来说,确实是调用了get这个static函数啊。

是我哪里没有理解对吗?

发表于 2022-3-31 11:12:49 来自手机 | 显示全部楼层


许晴125 发表于 2022-3-31 10:22
大佬,在top层我并没有调用任何bird的东西,但是从打印结果来说,确实是调用了get这个static函数啊。

...


看来你还有哪里没理解到,就看你这幅图62行,static bird me=get,这不是在调get函数吗?你在这个地方换成 static bird me;你看你get函数的东西还能打出来不
 楼主| 发表于 2022-3-31 11:49:22 | 显示全部楼层
本帖最后由 许晴125 于 2022-3-31 11:52 编辑


eaglezhang01 发表于 2022-3-31 11:12
看来你还有哪里没理解到,就看你这幅图62行,static bird me=get,这不是在调get函数吗?你在这个地方换 ...


一步是语法检查,第二步是elaboration,静态的东西应该就是在第二步准备好的,所以先于initial。
我理解这个case是静态的变量的初始化的语句会自动执行

看来了绿皮书的5.9.3静态变量的初始化,static 类型的变量应该是在initial之前自动执行。

所以不是函数自动调用,而是static修饰的静态变量在声明的时候初始化是自动执行的。
 楼主| 发表于 2022-3-31 11:55:21 | 显示全部楼层


eaglezhang01 发表于 2022-3-31 11:12
看来你还有哪里没理解到,就看你这幅图62行,static bird me=get,这不是在调get函数吗?你在这个地方换 ...


image.png

所以在源码里面,我们看到line82,其实就是自动初始化的。

不知道我理解的对不对?
发表于 2022-3-31 11:59:05 来自手机 | 显示全部楼层


许晴125 发表于 2022-3-31 11:49
一步是语法检查,第二步是elaboration,静态的东西应该就是在第二步准备好的,所以先于initial。
我理解这 ...


这次理解正确
发表于 2022-3-31 12:02:11 来自手机 | 显示全部楼层


许晴125 发表于 2022-3-31 11:55
所以在源码里面,我们看到line82,其实就是自动初始化的。

不知道我理解的对不对?


嗯,是的,昨天晚上我就说你要到这个class里面来看,重点其实就是static的变量初始化的时候你调了这个函数,所以就执行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 11:04 , Processed in 0.037379 second(s), 7 queries , Gzip On, Redis On.

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