在理解$cast作用之前,需要特别清晰derived class 和base class,handle和object之间区别
可以将derived handle强制赋值给base handle,使用base handle去引用derived object,因为derived class继承自base class,使用base handle引用的内容都在derived class中存在。简单来说就是,我要的他都有。
反之则不行,无法直接将base handle赋值给derived handle,无法使用derived handle去引用base object,因为使用derived handle引用的内容在base object中可能不存在。简单来说就是,你有的我都有,我有的你不一定有。
实际上,有可能derived handle需要引用的内容在base object中都已经定义了,即“我有的你也有”,这种情况是可以将base handle赋值给derived handle的。这个时候需要使用**$cast**做check&transfer即可。
base my_base;
child my_child;
my_child = new();
my_base = my_child;
my_base = new();
$cast(my_child, my_base);
$cast失败实例:
class base;
int a = 5;
endclass
class child extends base;
int b = 1;
endclass
module top;
initial begin
base my_base;
child my_child;
my_base = new();
$cast(my_child, my_base);
$display(my_child.a);
endendmodule
Log:
# ** Error: (vsim-3971) $cast to type 'class work.test_sv_unit::child'from 'class work. test _sv_unit::base' failed in file test.sv at line 16.
$cast成功实例:
classbase;
int a = 5;
endclass
class child extends base;
int a = 1;
int b = 2;
endclass
module top;
initial begin
base my_base;
child my_child,my_child2;
my_child2 = new();
my_base = my_child2 ;
$cast(my_child, my_base);
$display(my_child.a);
$display(my_child.b);
end
endmodule
所以从base class “cast”到derived class的前提是,该base object事实上就是derived object。
使用$cast的一种**场景**是将某些derived class数据传递到**其他同类**derived class中,并且接收类的开发人员甚至不知道传入的类是哪种子类,因此通常他会在接收类使用base class来获取传入的数据,然后使用\*\*$cast将数据检查/传输**到某些接收类中。
那么不直接将derived class数据传递到derived class呢?区别在于下面两张图
有个公共接口,图个方便。
本文感谢数字IC设计交流二群张乾和Eternity技术支持
本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/pK4jHgeAvhyCG4xA773HgA
未经作者同意,请勿转载!
推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏