story · 2020年06月02日

SystemVerilog 概念浅析之$cast

在理解$cast作用之前,需要特别清晰derived classbase classhandleobject之间区别

可以将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呢?区别在于下面两张图
62.png
62.bmp

有个公共接口,图个方便。

本文感谢数字IC设计交流二群张乾和Eternity技术支持
640.bmp本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/pK4jHgeAvhyCG4xA773HgA
未经作者同意,请勿转载!

推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏
推荐阅读
关注数
12316
内容数
220
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息