systemverilog演员的特点

时间:2013-07-24 00:07:19

标签: system-verilog downcast

我的问题是关于在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

1 个答案:

答案 0 :(得分:0)

IEEE Std 1800-2012§8.4(& IEEE Std1800-2005§7.4)声明:

  

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

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

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