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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8827|回复: 10

[求助] systemverilog $cast的使用

[复制链接]
发表于 2015-1-3 10:55:46 | 显示全部楼层 |阅读模式

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

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

x
《system verilog验证》一书中说,将$cast作为一个任务来使用的时候,sv会检查源对象类型,如果和目的对象类型不匹配则给出一个错误报告。当$cast作为函数使用时,sv仍会做类型检查,但是在失配时不再输出错误信息。如果类型不兼容,$cast函数返回0,如果类型兼容则返回非零值。
我想请教的是:
1.怎样让$cast做函数使用,又怎样让$cast做任务使用?
2.$cast可以让派生类句柄指向基类对象,但有时候可以,有时候又非法,怎么判断?
3.所谓的源对象类型和目的对象类型不匹配是什么意思,不兼容又是什么意思?
发表于 2015-1-7 23:56:52 | 显示全部楼层
建议去看看面向对象的基本原理。
if($cast(a, b)) begin
    `vmm_fatal(this.log, $sformatf(“the b type %0s is not the a type's %0s extensions”, a.get_typename(), b.get_typename));
end
发表于 2015-1-9 09:03:19 | 显示全部楼层
回复 2# qw342333

应该是    if(!cast(a,b))  display("wrong!!!");
类型转换成功返回1.
发表于 2015-1-11 22:46:23 | 显示全部楼层
回复 1# xuhaoee


    It would be help for me. thanks
发表于 2015-1-23 22:42:17 | 显示全部楼层
第一个上面已经回答了,我来说下后面两个:
class base_class;
    ……
endclass
class sub_class extends base_class;
……
endclass
base_clase     bc;
sub_class       sc = new();
bc = sc;//这是将基类句柄指向派生类(ok)
但是下面这种情况就不行:
base_class bc;
sub_class sc;
bc = new();
sc = bc;//将派生类句柄指向基类(fail)
$cast(sc,bc);//此时通过cast方式仍然不行
如果想要让派生类句柄指向基类,只能这样:
base_class bc;
sub_class sc1;
sub_class sc2;
sc2 = new();
bc = sc2;
sc1 = bc;//不行
$cast(sc1,bc);//通过cast方式可以实现了,可以看到bc的句柄类型虽然是基类,但其指的对象类型是派生类啊
你可能觉得这样有什么意义呢,还记得我们经常写的copy()函数吗?派生类想要重写基类的copy函数,那么它的copy函数的返回值和参数类型都要和基类中的copy函数保持一致,如下:关闭
  • 网络图片











如果你要调用派生类得copy函数
badTr  b_tr1 = new();
badTr  b_tr2 = new();
……
b_tr1.copy(b_tr2);
那么这个派生类中的cast就起到作用了;
base_copy.png
sub_copy.png
发表于 2015-3-6 12:47:54 | 显示全部楼层
$cast作为函数和任务格式是不一样的:
function int $cast( singular dest_var, singular source_exp );
task $cast( singular dest_var, singular source_exp );
另外,$cast作为任务调用时,如果调用不合法,run-time error会出现,而作为函数调用时如果cast失败,则没有erro出现,另外还有一些可以看看www.asicdv.com中的介绍。
发表于 2015-3-6 13:02:41 | 显示全部楼层
本帖最后由 asicdv 于 2015-3-6 13:03 编辑

回复 5# ziqiu08

首先作为任务和函数格式是不同的:

function int $cast( singular dest_var, singular source_exp );

task $cast( singular dest_var, singular source_exp );



另外,如果转换失败作为任务会有run-time error产生,而作为函数则没有,还有一些可以参阅www.asicdv.com
发表于 2018-7-26 10:54:21 | 显示全部楼层
回复 6# asicdv


   
那调用$cast的时候,怎么知道它是作为函数还是作为任务调用的?比如:

    例子1:typedef enum {red, green, blue, yellow, white, black} Colors;

               Colors col;

               $cast(col, 2+3);                   //这个$cast是做为函数还是任务调用的?

   

    例子2:if (!$cast(col, 2+3))             //这个$cast是做为函数还是任务调用的?

                $display("Error in cast");
发表于 2018-8-7 14:07:42 | 显示全部楼层
回复 8# 方大囧


   我是新手,看不懂前面大佬们的解释,但是大胆猜测前一个任务后一个函数,因为function不声明void默认是有返回值的,task是没有的
发表于 2022-2-8 14:08:06 | 显示全部楼层


其实是当函数还是任务使用是看你自己,比如第一个没有返回值,编译器就会认为你使用的是任务,第二个有返回值,编译器就会认为你使用的是函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-15 13:43 , Processed in 0.025853 second(s), 9 queries , Gzip On, Redis On.

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