|HOME |ABOUT |ARTICLES |ACK |FEEDBACK |TOC |LINKS |BLOG |JOBS |


Tutorials



CASTING




It is always legal to assign a subclass variable to a variable of a class higher in the inheritance tree.


EXAMPLE
class parent;
int i = 10;
endclass

class subclass extends parent;
int j;

function new();
j = super.i;
$display("J is %d",j);
endfunction
endclass

program main;
initial
begin
subclass s;
s = new();
end
endprogram
RESULT

J is 10




It is never legal to directly assign a superclass variable to a variable of one of its subclasses.

However, it is legal to assign a superclass handle to a subclass variable if the superclass handle refers to an object of the given subclass.

SystemVerilog provides the $cast system task to assign values to variables that might not ordinarily be valid because of differing data type. To check whether the assignment is legal, the dynamic cast function $cast() is used . The syntax for $cast() is as follows:

task $cast( singular dest_handle, singular source_handle );
or
function int $cast( singular dest_handle, singular source_handle );

When called as a task, $cast attempts to assign the source expression to the destination variable. If the assignment is invalid, a run-time error occurs, and the destination variable is left unchanged.


EXAMPLE : $cast as task
class B;
virtual task print();
$display(" CLASS B ");
endtask
endclass

class E_1 extends B;
virtual task print();
$display(" CLASS E_1 ");
endtask
endclass

class E_2 extends B;
virtual task print();
$display(" CLASS E_2 ");
endtask
endclass

program main;
initial
begin
B b;
E_1 e1;
E_2 e2;

e1 = new();
$cast(b,e1);
b.print();

end
endprogram
RESULT

CLASS E_1


EXAMPLE : $cast as task with error
class B;
virtual task print();
$display(" CLASS B ");
endtask
endclass

class E_1 extends B;
virtual task print();
$display(" CLASS E_1 ");
endtask
endclass

class E_2 extends B;
virtual task print();
$display(" CLASS E_2 ");
endtask
endclass

program main;
initial
begin
B b;
E_1 e1;
E_2 e2;

e1 = new();
$cast(e2,e1);

end
endprogram
RESULT

Error: Dynamic cast failed




When called as a function, $cast attempts to assign the source expression to the destination variable and returns 1 if the cast is legal. If the cast fails, the function does not make the assignment and returns 0. When called as a function, no run-time error occurs, and the destination variable is left unchanged. It is important to note that $cast performs a run-time check. No type checking is done by the compiler, except to check that the destination variable and source expression are singulars.




EXAMPLE : $cast as function
class B;
virtual task print();
$display(" CLASS B ");
endtask
endclass

class E_1 extends B;
virtual task print();
$display(" CLASS E_1 ");
endtask
endclass

class E_2 extends B;
virtual task print();
$display(" CLASS E_2 ");
endtask
endclass

program main;
initial
begin
B b;
E_1 e1;
E_2 e2;

e1 = new();
//calling $cast like a task
//Return value is not considered
$cast(b,e1);
which_class(b);

e2 = new();
//calling $cast like a task
//Return value is not considered
$cast(b,e2);
which_class(b);

end
endprogram

task which_class(B b);
E_1 e1;
E_2 e2;
//calling $cast like a function
//Return value is considered for action
if($cast(e1,b))
$display(" CLASS E_1 ");
if($cast(e2,b))
$display(" CLASS E_2 ");
endtask
RESULT

CLASS E_1
CLASS E_2





When used with object handles, $cast() checks the hierarchy tree (super and subclasses) of the source_expr to see whether it contains the class of dest_handle. If it does, $cast() does the assignment. Otherwise, the error is issued.

Assignment of Extended class object to Base class object is allowed. It is Illegal to assign Base class object to Extended class.



EXAMPLE
class Base;
endclass

class Exten extends Base;
endclass

program main;

initial
begin
Base B;
Exten E;
B = new();
if(!$cast(E,B))
$display(" Base class object B canot be assigned to Extended class Handle.");
// Deallocate object B
B = null;
E = new();
if(!$cast(B,E))
$display(" Extended class object E canot be assigned to Base class Handle.");
end
endprogram

RESULT

Base class object B canot be assigned to Extended class Handle.

Index
Introduction
Class
Object
This
Inheritance
Encapsulation
Polymorphism
Abstract Classes
Parameterised Class
Nested Classes
Constant
Static
Casting
Copy
Scope Resolution Operator
Null
External Declaration
Classes And Structures
Typedef Class
Pure
Other Oops Features
Misc

Report a Bug or Comment on This section - Your input is what keeps Testbench.in improving with time!





<< PREVIOUS PAGE

TOP

NEXT PAGE >>

copyright © 2007-2017 :: all rights reserved www.testbench.in::Disclaimer