我的问题是关于在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
答案 0 :(得分:0)
IEEE Std 1800-2012§8.4(& IEEE Std1800-2005§7.4)声明:
访问非静态成员(见8.9)或虚拟方法(见8.20) 通过null对象句柄是非法的。非法访问的结果 通过null对象是不确定的,并且实现可以发出 错误。
我无法找到有关默认方法类型应该发生什么的任何参考。基于LRM,它表明只要该方法不调用任何非静态成员,通过空对象句柄调用非虚方法就是合法的。
使方法bob virtual
获取空对象句柄错误。