System verilog systemverilog强制转换特性

System verilog systemverilog强制转换特性,system-verilog,downcast,System Verilog,Downcast,我的问题是关于在SV中使用$cast。 如果您在下面的代码中搜索单词cast,我特意添加了一个“!”检查铸造是否失败。如果转换失败,我想看看调用bobsquare.bob()时会发生什么; 我感到惊讶的是,当使用多边形“p”的句柄调用call_bob时,调用square类中的函数“bob”来执行display语句。这怎么可能呢?我使用Cadence的irun运行,并使用SV类浏览器进行调试,发现在时间=1ms时,bobsquare甚至没有分配mem空间,指针为NULL。 谢谢 §8.4(&IEE

我的问题是关于在SV中使用$cast。 如果您在下面的代码中搜索单词cast,我特意添加了一个“!”检查铸造是否失败。如果转换失败,我想看看调用bobsquare.bob()时会发生什么; 我感到惊讶的是,当使用多边形“p”的句柄调用call_bob时,调用square类中的函数“bob”来执行display语句。这怎么可能呢?我使用Cadence的irun运行,并使用SV类浏览器进行调试,发现在时间=1ms时,bobsquare甚至没有分配mem空间,指针为NULL。 谢谢

§8.4(&IEEE标准1800-2005§7.4)规定:

访问非静态成员(见8.9)或虚拟方法(见8.20) 通过空对象句柄是非法的。非法访问的结果 通过空对象是不确定的,实现可能会发出 错误

我找不到任何关于默认方法类型应该发生什么的参考。基于LRM,只要方法不调用任何非静态成员,通过空对象句柄调用非虚拟方法似乎是合法的


使方法bob
virtual
获得空对象句柄错误。

我认为您的期望是正确的,而且听起来模拟器的行为不符合语言规范。如果您可以访问另一个模拟器(VCS或Questa),它将有兴趣查看您从中得到的结果。因为您已经有了一个测试用例,所以您可以向Cadence提交支持请求,并从他们那里获得一些反馈。这可能是一个工具错误。
class figure;

endclass

class polygon extends figure;

  virtual function void draw();
    $display("polygon::draw");
  endfunction

endclass

class square extends polygon;

  virtual function void draw();
    $display("square::draw");
  endfunction

  function void compute_area();
    $display("square::compute_area");
  endfunction

  function void bob();
     $display("square::I am bob");
     $display("%t", $realtime);     
  endfunction

endclass

program top;
  polygon p;
  square s;

  initial begin
    s = new();
    p = new();

     #1ms;
     call_bob(p);
     #1ms;
     call_bob(s);     
  end // initial begin
   task call_bob(figure generic_ref_figure);
      square bobsquare;      
      if (!($cast(bobsquare, generic_ref_figure)))
         bobsquare.bob();
   endtask // call_bob

endprogram