对象的动态类型转换

编程语言 2026-07-10

我在代码中尝试使用 $cast 进行动态类型转换。

在用Synopsys VCS进行仿真时,我遇到了一个错误,但同样的代码在Aldec中并未出错。

我对动态类型转换的确切行为理解得并不清楚——它是如何工作的、它在内部实际执行的内容、何时应当使用,以及正确的使用方式。

能否请你解释 $cast 的正确行为,特别是为何在这种情况下不同的仿真器会显示不同的结果?

class p_class;
  bit [31:0] p_Var;
  function void display();
    $display("p_Var = %0d",p_Var);
  endfunction
endclass

class c_class extends p_class;
  bit [31:0] c_Var;
  function void display( );
    super.display( );
    $display("c_Var = %0d",c_Var);
  endfunction
endclass

module top;
  initial begin
    p_class p = new();
    c_class c = new();
    c.p_Var = 10;
    c.c_Var = 20;
    $cast(c, p);    //dynamic cast
    c.display();
  end
endmodule

这是错误信息:

ERROR = 
Error-[DCF] Dynamic cast failed
  Casting of source class type 'p_class' to destination class type 'c_class' 
  failed due to type mismatch.
  Please ensure matching types for dynamic cast

解决方案

如此示例中,所有工具对动态 $cast(c,p) 都会报错,这是应有的,因为类变量 p 包含对一个 p_class 对象的句柄,而该对象没有 c_Var 变量。如果它成功,对 c.c_Var 的引用将毫无意义。

看起来VCS将此系统任务调用视为致命错误,并且不执行后续的 c.display 语句。相反,其他所有工具都能正确地将其识别为运行时错误,显示错误信息,并继续执行。

如果在表达式中将 $cast 作为函数调用,如同 if ($cast(c.p) c.display();,在此示例中所有工具都正确返回0。这就是人们通常使用 $cast 的方式。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章