Незаконный доступ к нестатическому методу questaSim

Я получаю сообщение об ошибке 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

person user123577    schedule 24.07.2014    source источник
comment
Должно ли expr быть expresion?   -  person Tim    schedule 24.07.2014
comment
да извини я исправлю   -  person user123577    schedule 24.07.2014
comment
Ваш код неполный. Покажите, как выглядят foo_class и foo_base (структура, кто от кого наследуется, как определены функции, т.е. с какими модификаторами и т. д.).   -  person Tudor Timi    schedule 24.07.2014


Ответы (2)


Я предполагаю, что foo_class является потомком foo_base, и в этом случае используйте super.foo_base_error вместо foo_base::foo_base_error

Чтобы вызвать нестатический метод, он должен принадлежать объекту. Его нельзя вызывать непосредственно из области видимости класса. Статические методы можно вызывать непосредственно из области видимости класса.

В файле журнала VCS должно быть предупреждение. Симулятор, вероятно, прощает ошибки и либо делает foo_base_error статическим, либо внутренне меняет местами foo_base:: на super.. questaSim более строго следует LRM.

Ссылки Стандарт IEEE 1800-2012:

  • 8.10 Статические методы
  • 8.15 Супер
  • 8.24 Объявления вне блока
person Greg    schedule 24.07.2014
comment
foo_base::foo_base_error может быть законным, но вы не показали полные прототипы всех задействованных методов. Есть ли в вашем коде статические методы? - person dave_59; 26.07.2014

Вот что говорится в стандарте 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.

person Tudor Timi    schedule 24.07.2014