引用SV LRM。
将子类类型的表达式赋给a总是合法的 继承树中更高类类型的变量(超类 表达式的祖先或祖先)。直接是非法的 将超类类型的变量赋值给其中一个变量 子类型。但是,$ cast可用于分配超类 处理超类句柄提供的子类类型的变量 指的是与子类兼容的赋值对象 变量
当我们尝试将超类实例分配给子类实例时,转换会失败的场景是什么时候?我理解每当我们尝试转换两个彼此不兼容的实例时,转换会失败。如果它们属于同一层次结构树,那么铸造会失败吗?如果是的话,我可以知道什么时候?
答案 0 :(得分:3)
您永远不会对类实例进行赋值 - 您可以使用类类型对变量进行赋值。区别是微妙的,但重要的是要知道类类型与类变量和类实例之间的区别。
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的类实例的句柄,并且试图将它分配给类型C的类变量。这段代码非常简单但是在更大的环境中,它并不总是很容易知道在a_h中保存了什么实例,SystemVerilog需要运行时检查。