对象的动态类型转换
我在代码中尝试使用 $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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。