【问题标题】:How to do Down casting between same extended classes in systemverilog?如何在systemverilog中的相同扩展类之间进行向下转换?
【发布时间】:2021-09-16 10:43:39
【问题描述】:

我正在尝试了解 uvm 中相同扩展类之间的情况,如下例所示,

  module test_module ();
  
class A; endclass
class B extends A; endclass
class C extends A; endclass

A a_h;
B b_h;
C c_h;

  initial begin

    c_h = new();
    b_h = c_h;
    $cast(c_h, b_h); 
  end
endmodule : test_module

我得到了 xrun: 20.09-s003: (c) 版权所有 1995-2020 Cadence Design Systems, Inc. b_h = c_h; | xmvlog: *E,TYCMPAT (testbench.sv,20|12):赋值运算符类型检查失败(期望数据类型与 'class test_module::B' 兼容,但找到了 'class test_module::C')。 错误信息。

我认为 b_h 和 c_h 是由同一个类扩展的。

但是 b_h 和 c_h 不是同一个类类型所以。

我分配 b_h = c_h;

但是为什么assign会出错呢?

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    如果您将类属性添加到示例中,将更容易理解您的问题。

    module test_module ();
      
     class A; int p1; endclass
     class B extends A; int p2; endclass
     class C extends A; int p3; endclass
    
      A a_h;
      B b_h;
      C c_h;
    
      initial begin
    
        c_h = new();  
        b_h = c_h;       
        $cast(c_h, b_h);
      end
    endmodule : test_module
    

    语句c_h = new(); 构造了一个具有p1p3 属性的类对象。所以你应该可以参考c_h.p1c_h.p3。您可以根据类变量的类型引用类对象中的任何属性。

    类变量b_h 允许您访问b_h.p1b_h.p2。但是,如果允许您执行语句 b_h = c_h; 然后尝试引用 b_h.p2,那将是一个问题,因为您放置在 b_h 中的对象从未构造过 p2 属性。

    您的示例从不引用p2 并不重要;编译器永远不会允许赋值。如果它们是相同的类类型,或者从扩展类型变为基类型(upcast),则只能将它们从一个类变量直接赋值给另一个。

    【讨论】:

      【解决方案2】:

      你有以下方案:

           /--->B
      A--->
           \--->C
      
      

      A 和 B 或 A 和 C 之间存在直接依赖关系(A 是 B 和 C 的超类)。 B 和 C 之间没有直接的依赖关系。

      因此您可以轻松做到:

      a_h = b_h; // no casting needed to assign to superclass-A-type
      $cast(b_h, a_h); // you need a cast to upcast the base pointer.
      

      但无法投射$cast(b_h, c_h),因为它们不相关。

      更正式:

      当 $cast 应用于类句柄时,它只在三种情况下成功:

      1. 源表达式和目标类型是赋值兼容的,即目标是 源表达式的相同类型或超类。
      2. 源表达式的类型转换为与目标类型兼容,即: — 源表达式的类型是目标类型的超类,或者 — 源表达式的类型是一个接口类(见 8.26) 源是与目标类型兼容的赋值对象。这类 分配需要 $cast 提供的运行时检查。
      3. 源表达式是字面常量 null。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 2019-09-18
        • 2016-02-05
        相关资源
        最近更新 更多