层次结构中的动态转换
Dynamic casting in hierarchy
引用 SV LRM。
It is always legal to assign an expression of subclass type to a
variable of a class type higher in the inheritance tree (a superclass
or ancestor of the expression type). It shall be illegal to directly
assign a variable of a superclass type to a variable of one of its
subclass types. However, $cast may be used to assign a superclass
handle to a variable of a subclass type provided the superclass handle
refers to an object that is assignment compatible with the subclass
variable.
当我们尝试将超级 class 实例分配给子 class 实例时,转换会在什么情况下失败?我知道每当我们尝试投射两个彼此不兼容的实例时,投射都会失败。如果他们属于同一层次结构树,铸造会随时失败吗?如果是,我可以知道什么时候吗?
您永远不会对 class 实例进行赋值 - 您对具有 class 类型的变量进行赋值。区别很微妙,但重要的是要了解 class 类型之间的区别以及它如何应用于 class 变量和 class 实例。
LRM所指的情况是这样的
class A; endclass
class B extends A; endclass
class C extends A; endclass
A a_h;
B b_h;
C c_h;
b_h = new;
a_h = b_h; // always legal to go up the inheritance tree
$cast(b_h, a_h); // $cast required - will succeed
$cast(c_h, a_h); // $cast required - will fail
第二个 $cast 失败,因为 a_h 持有类型 B 的 class 实例的句柄,并试图将其分配给类型 C 的 class 变量。这段代码非常简单,但在更大的环境中,要知道 a_h 中保存的是什么实例并不总是那么容易,SystemVerilog 需要 运行 次检查。
引用 SV LRM。
It is always legal to assign an expression of subclass type to a variable of a class type higher in the inheritance tree (a superclass or ancestor of the expression type). It shall be illegal to directly assign a variable of a superclass type to a variable of one of its subclass types. However, $cast may be used to assign a superclass handle to a variable of a subclass type provided the superclass handle refers to an object that is assignment compatible with the subclass variable.
当我们尝试将超级 class 实例分配给子 class 实例时,转换会在什么情况下失败?我知道每当我们尝试投射两个彼此不兼容的实例时,投射都会失败。如果他们属于同一层次结构树,铸造会随时失败吗?如果是,我可以知道什么时候吗?
您永远不会对 class 实例进行赋值 - 您对具有 class 类型的变量进行赋值。区别很微妙,但重要的是要了解 class 类型之间的区别以及它如何应用于 class 变量和 class 实例。
LRM所指的情况是这样的
class A; endclass
class B extends A; endclass
class C extends A; endclass
A a_h;
B b_h;
C c_h;
b_h = new;
a_h = b_h; // always legal to go up the inheritance tree
$cast(b_h, a_h); // $cast required - will succeed
$cast(c_h, a_h); // $cast required - will fail
第二个 $cast 失败,因为 a_h 持有类型 B 的 class 实例的句柄,并试图将其分配给类型 C 的 class 变量。这段代码非常简单,但在更大的环境中,要知道 a_h 中保存的是什么实例并不总是那么容易,SystemVerilog 需要 运行 次检查。