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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 22436|回复: 29

[讨论] systemverilog 为什么要用$cast()类型转换函数??

[复制链接]
发表于 2014-8-8 17:18:50 | 显示全部楼层 |阅读模式

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

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

x
今天在给同事讲$cast函数的用法,突然同事问道  为什么用这个函数?哪里需要用到?
我是这样理解的,比如我的sequence要发送基类数据包和扩展类数据包,交替的发送,但是driver这边是一次只能申请一个包,那就需要driver 发送握手信号给sequence 产生那种数据包,这样就显得很麻烦。

如果driver只申请扩展数据包或者基类数据包,不能满足要求。  如果能有一个函数能够判断driver申请到的数据包是何种包,就会减少很多工作量。不知道我理解的对不对。

sv中的$cast应该是OOP中的东西,至于为什么要创造这个函数,我确实不太清楚,我的软件基础不太好。

欢迎大神指点。。。
发表于 2014-8-11 11:41:54 | 显示全部楼层
1)能将扩展类句柄赋值给基类句柄
2)不能将基类句柄赋值给扩展类句柄,如果要赋值,则需要用cast来转换
3)个人认为是为了方便又灵活地调用同时存在于基类和扩展类中的方法(函数、任务)
 楼主| 发表于 2014-8-11 12:18:34 | 显示全部楼层
如果不用$cast函数,也可以实现类型的赋值吧?
不用$cast函数,也可以实现数据交互的基本功能吧。在driver中申请什么类型的数据,sequence就产生什么数据岂不是更好。。
发表于 2014-8-13 09:12:51 | 显示全部楼层
首先请问,如果要将父类对象赋值给子类对象,你如何实现啊?提前通俗一点讲:子类的作用范围是大于等于父类的。
这个时候就会用到$cast函数,它将完成赋值并且判断赋值是否合法。
 楼主| 发表于 2014-8-13 10:09:42 | 显示全部楼层
我的意思是为什么要将父类对象赋值给子类对象?什么时候会用到这个?一般在什么情况下用到。。。。。
发表于 2014-8-13 21:32:30 | 显示全部楼层
在transion的时候,一个port需要传送不同类型的transion的时候,在获取到的时候就需要父类转换成子类,就需要使用cast函数
发表于 2014-8-13 22:39:29 | 显示全部楼层
感觉没有$cast, 很多东西都没法玩了
发表于 2014-9-9 14:29:10 | 显示全部楼层




   只有父类句柄指向的对象是真正的子类对象时,可以用cast使新的子类句柄指向该子类对象。我碰到的应用情况都是需要将原有类扩展新功能时用到cast,例如:A类作为基类,由于某些测试的特殊需求,我将A类衍生出一个子类A_EXT,其中加入了新的变量、方法或约束,然后在对应test的build phase里面用override_by_type将A替换为A_EXT。在sequence中我需要声明一个A_EXT的句柄,然后将原有结构中A用cast转换到A_EXT,此时才能用新加入的变量或方法。
由于override的作用,对象在create时已经是A_EXT类型的对象,但句柄还是原来A的句柄,这时就用到cast函数。
新手的理解,供参考。
发表于 2014-9-9 19:05:22 | 显示全部楼层
回复 5# allencherry


   假如你要收很多类型的包,这些包都是基于一个base类扩展的,然后你会发现你需要一个基类的handle来处理这些包,等你拿到这些不同类型的包的实例,你可以使用if($cast(base_ext1, base)) begin ...end else if($cast(base_ext2, base)) begin ...end 按照包的类型来分类处理你接受的包。
 楼主| 发表于 2014-9-10 09:03:18 | 显示全部楼层


回复  allencherry


   假如你要收很多类型的包,这些包都是基于一个base类扩展的,然后你会发现你需要 ...
hbhbts 发表于 2014-9-9 19:05




   八,九楼说的没错,假设有一种情况,我在driver里面只处理一种扩展类数据包,基类的指针是指向扩展类对象的地址,如果直接得到扩展类对象的指针,这样就不需要使用$cast()了吧??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-12-18 19:57 , Processed in 0.033828 second(s), 9 queries , Gzip On, Redis On.

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