当我尝试使用Illegal to access non-static method foo in static method.
进行编译时遇到错误vlog
而vcs
让它毫不费力地通过。function foo_class::error(string expression, string filename, int linenumber);
foo_base::foo_base_error(expression, filename, linenumber);
endfunction
任何人都有如何解决这个问题。
{{1}}
答案 0 :(得分:0)
这是SV 2012标准在8.10静态方法中所述的内容:
静态方法无法访问非静态成员(类属性 或方法),但它可以直接访问静态类属性或 调用同一类的静态方法。
您似乎试图访问不同类的静态方法,这违反了LRM的措辞。如果foo_base
是foo_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_class
是foo_base
的孩子,在这种情况下使用super.foo_base_error
代替foo_base::foo_base_error
要调用非静态方法,它需要属于一个对象。它不能直接从类范围调用。可以直接从类范围调用静态方法。
您的VCS日志文件中应该有警告。模拟器很可能是宽容的,可以在内部进行foo_base_error
静态或交换foo_base::
到super.
。 questaSim在遵循LRM方面更加严格。
参考文献IEEE Std 1800-2012: