编程自学网编程自学网编程自学网

$cast详解

systemverilog中$cast作用

在理解$cast作用之前,需要特别清晰derived class 和base 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呢?区别在于下面两张图
$cast详解(图1)
$cast详解(图2)


未经允许不得转载:编程自学网 » $cast详解