非法访问非静态方法questaSim

时间:2014-07-24 13:53:20

标签: verilog fpga system-verilog

当我尝试使用Illegal to access non-static method foo in static method.进行编译时遇到错误vlogvcs让它毫不费力地通过。function foo_class::error(string expression, string filename, int linenumber); foo_base::foo_base_error(expression, filename, linenumber); endfunction 任何人都有如何解决这个问题。

{{1}}

2 个答案:

答案 0 :(得分:0)

这是SV 2012标准在8.10静态方法中所述的内容:

  

静态方法无法访问非静态成员(类属性   或方法),但它可以直接访问静态类属性或   调用同一类的静态方法。

您似乎试图访问不同类的静态方法,这违反了LRM的措辞。如果foo_basefoo_class的基类,则foo_class也包含foo_base_error(...)函数。尝试将其更改为:

function foo_class::error(string expression, string filename, int linenumber);
  foo_class::foo_base_error(expression, filename, linenumber);
endfunction

如果不是,那么你运气不好。似乎VCS对静态方法的解释比QuestaSim更宽松。

答案 1 :(得分:0)

我假设foo_classfoo_base的孩子,在这种情况下使用super.foo_base_error代替foo_base::foo_base_error

要调用非静态方法,它需要属于一个对象。它不能直接从类范围调用。可以直接从类范围调用静态方法。

您的VCS日志文件中应该有警告。模拟器很可能是宽容的,可以在内部进行foo_base_error静态或交换foo_base::super.。 questaSim在遵循LRM方面更加严格。

参考文献IEEE Std 1800-2012

  • §8.10静态方法
  • §8.15超级
  • §8.24块外声明