微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > systemverilog 为什么要用$cast()类型转换函数?

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

时间:10-02 整理:3721RD 点击:
今天在给同事讲$cast函数的用法,突然同事问道为什么用这个函数?哪里需要用到?
我是这样理解的,比如我的sequence要发送基类数据包和扩展类数据包,交替的发送,但是driver这边是一次只能申请一个包,那就需要driver 发送握手信号给sequence 产生那种数据包,这样就显得很麻烦。
如果driver只申请扩展数据包或者基类数据包,不能满足要求。如果能有一个函数能够判断driver申请到的数据包是何种包,就会减少很多工作量。不知道我理解的对不对。
sv中的$cast应该是OOP中的东西,至于为什么要创造这个函数,我确实不太清楚,我的软件基础不太好。
欢迎大神指点。

1)能将扩展类句柄赋值给基类句柄
2)不能将基类句柄赋值给扩展类句柄,如果要赋值,则需要用cast来转换
3)个人认为是为了方便又灵活地调用同时存在于基类和扩展类中的方法(函数、任务)

如果不用$cast函数,也可以实现类型的赋值吧?
不用$cast函数,也可以实现数据交互的基本功能吧。在driver中申请什么类型的数据,sequence就产生什么数据岂不是更好。

首先请问,如果要将父类对象赋值给子类对象,你如何实现啊?提前通俗一点讲:子类的作用范围是大于等于父类的。
这个时候就会用到$cast函数,它将完成赋值并且判断赋值是否合法。

我的意思是为什么要将父类对象赋值给子类对象?什么时候会用到这个?一般在什么情况下用到。

在transion的时候,一个port需要传送不同类型的transion的时候,在获取到的时候就需要父类转换成子类,就需要使用cast函数

感觉没有$cast, 很多东西都没法玩了

只有父类句柄指向的对象是真正的子类对象时,可以用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函数。
新手的理解,供参考。

假如你要收很多类型的包,这些包都是基于一个base类扩展的,然后你会发现你需要一个基类的handle来处理这些包,等你拿到这些不同类型的包的实例,你可以使用if($cast(base_ext1, base)) begin ...end else if($cast(base_ext2, base)) begin ...end 按照包的类型来分类处理你接受的包。

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


  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

复制代码

http://bbs.eetop.cn/viewthread.php?tid=473879
这个帖子也是这类讨论 可以看看
和8楼意见一致
9/11楼感觉是更高级的应用

看下Thinking in C++中有一章专门将RTTI的。$cast就是干这个的。
在OOP中,很多类型转换没法在compile time判断是否能转换过去,需要run time的去判断类型。

mark!sks

只有一种数据包,那就不要进行操作, 默认了,也不需要进行识别了

子父类转换相同的数据时,以及扩展类的对象时都会用到,感觉很万能的东西

你用的还是,父类的句柄指向子类的实例,OOP天然就支持。
你要使用$cast的原因应该当你使用父类的句柄来调用子类的函数(task),但是父类中没有相应的虚函数所以出错,我可以这样理解吗?
要不然就算不使用$cast也看出来你的使用场景会出问题

mark一下!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top