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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: allencherry

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

[复制链接]
发表于 2014-9-11 13:28:08 | 显示全部楼层
本帖最后由 seabeam 于 2014-9-11 15:27 编辑

回复 10# allencherry



  1. class amba_xaction ...
  2.   virtual task do_something();
  3. endclass


复制代码




  1. class ahb_xaction extends amba_xaction ...
  2.   task do_something();
  3.   ...
  4. endclass


复制代码




  1. class apb_xaction extends amba_xaction ...
  2.   task do_something();
  3.   ...
  4. endclass


复制代码
假设有个



  1. task do (amba_xaction t);
  2.   t.do_something();
  3.   ...
  4. endtask


复制代码
那么



  1. class client;
  2.   ahb_xaction h_t;
  3.   apb_xaction p_t;
  4.   amba_xaction t;
  5.   ...
  6.   if (!$cast(t, h_t)) ...
  7.     do(t);
  8.   if (!$cast(t, p_t)) ...
  9.     do(t);
  10. endclass


复制代码
发表于 2016-3-20 13:59:18 | 显示全部楼层
http://bbs.eetop.cn/viewthread.php?tid=473879
这个帖子也是这类讨论 可以看看
和8楼意见一致
9/11楼感觉是更高级的应用
发表于 2016-4-3 23:07:54 | 显示全部楼层
看下Thinking in C++中有一章专门将RTTI的。$cast就是干这个的。
在OOP中,很多类型转换没法在compile time判断是否能转换过去,需要run time的去判断类型。
发表于 2017-9-7 14:16:44 | 显示全部楼层
mark!sks
发表于 2017-9-7 14:21:56 | 显示全部楼层
回复 10# allencherry


   只有一种数据包,那就不要进行操作, 默认了,也不需要进行识别了
发表于 2017-9-8 16:31:47 | 显示全部楼层
子父类转换相同的数据时,以及扩展类的对象时都会用到,感觉很万能的东西
发表于 2017-9-8 17:11:23 | 显示全部楼层
回复 8# cmgit


    你用的还是,父类的句柄指向子类的实例,OOP天然就支持。
你要使用$cast的原因应该当你使用父类的句柄来调用子类的函数(task),但是父类中没有相应的虚函数所以出错,我可以这样理解吗?
要不然就算不使用$cast也看出来你的使用场景会出问题
发表于 2017-9-14 17:34:25 | 显示全部楼层
mark一下!
发表于 2018-6-1 16:44:47 | 显示全部楼层
回复 2# sonicsun
父类能调用子类中的方法,定义Virtual就可以了。但是要想访问子类中的变量那就只能$cast一下了
发表于 2018-6-1 16:47:59 | 显示全部楼层
回复 5# allencherry当你想要 访问子类在中的变量时,父类句柄是访问不到的,只有子类句柄才能访问到子类中的变量,就需要动态转换一下了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-18 20:36 , Processed in 0.020801 second(s), 7 queries , Gzip On, Redis On.

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