systemverilog演员的特点

问题描述 投票:1回答:1

我的问题是关于在SV中使用$ cast。如果你在下面的代码中搜索单词cast,我有意添加一个'!'检查铸造不成功。如果演员不成功,我想看看调用bobsquare.bob()时会发生什么。令我感到惊讶的是,在时间= 1ms时,使用多边形'p'的句柄调用call_bob时,调用方形类中的函数'bob'来执行显示语句。怎么可能呢?我使用Cadence的irun运行并使用SV类浏览器调试并看到在时间= 1ms时,bobsquare甚至没有分配mem空间并且具有NULL作为指针。谢谢!

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
system-verilog downcast
1个回答
0
投票

IEEE Std 1800-2012§8.4(&IEEE Std1800-2005§7.4)规定:

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

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

使方法bob virtual获取null对象句柄错误。

© www.soinside.com 2019 - 2024. All rights reserved.