【问题标题】:Dynamic casting in hierarchy层次结构中的动态转换
【发布时间】:2016-06-20 07:59:10
【问题描述】:

引用 SV LRM。

将子类类型的表达式分配给 继承树中较高的类类型的变量(超类 或表达式类型的祖先)。直接上车是违法的 将超类类型的变量分配给它的一个变量 子类类型。但是,$cast 可用于分配超类 提供超类句柄的子类类型变量的句柄 指的是与子类兼容的赋值对象 变量。

当我们尝试将超类实例分配给子类实例时,转换失败的场景是什么时候?我知道每当我们尝试投射两个彼此不兼容的实例时,投射都会失败。如果它们落在同一层次树下,铸造会随时失败吗?如果有,我可以知道什么时候吗?

【问题讨论】:

    标签: oop inheritance casting system-verilog uvm


    【解决方案1】:

    您永远不会对类实例进行赋值 - 您对具有类类型的变量进行赋值。区别很微妙,但了解类类型之间的区别以及如何将其应用于类变量和类实例很重要。

    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 需要运行时检查。

    【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    相关资源
    最近更新 更多