systemverilog $cast的使用
我想请教的是:
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