微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > systemverilog $cast的使用

systemverilog $cast的使用

时间:10-02 整理:3721RD 点击:
《system verilog验证》一书中说,将$cast作为一个任务来使用的时候,sv会检查源对象类型,如果和目的对象类型不匹配则给出一个错误报告。当$cast作为函数使用时,sv仍会做类型检查,但是在失配时不再输出错误信息。如果类型不兼容,$cast函数返回0,如果类型兼容则返回非零值。
我想请教的是:
1.怎样让$cast做函数使用,又怎样让$cast做任务使用?
2.$cast可以让派生类句柄指向基类对象,但有时候可以,有时候又非法,怎么判断?
3.所谓的源对象类型和目的对象类型不匹配是什么意思,不兼容又是什么意思?

建议去看看面向对象的基本原理。
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

应该是if(!cast(a,b))display("wrong!");
类型转换成功返回1.

It would be help for me. thanks

第一个上面已经回答了,我来说下后面两个:
class base_class;
……
endclass
class sub_class extends base_class;
……
endclass
base_clasebc;
sub_classsc = 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函数
badTrb_tr1 = new();
badTrb_tr2 = new();
……
b_tr1.copy(b_tr2);
那么这个派生类中的cast就起到作用了;

$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中的介绍。

首先作为任务和函数格式是不同的:
function int $cast( singular dest_var, singular source_exp );
task $cast( singular dest_var, singular source_exp );

另外,如果转换失败作为任务会有run-time error产生,而作为函数则没有,还有一些可以参阅www.asicdv.com

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

网站地图

Top