Как в specman проверить наличие переменной или поля структуры?

Немногое в руководстве specman указывает на то, что можно определить на лету, была ли создана определенная переменная. (не спрашивая о тестировании индекса массива или членов хэша, что можно сделать с помощью exists() )

Я только заметил, что в обсуждении разрешения имени/пути структуры говорится, что попытка «сохранить» поле структуры, которое не существует в разрешенном пути, приведет к ошибке и _must_be_ закомментировано...

Моя работа включает в себя моделирование модели, постоянно обновляемой несколькими разработчиками электронного кода, и испытательные стенды теряют обратную совместимость всякий раз, когда кто-то просто создает новую переменную для дальнейшего определения параметров модели и сборки TCM.


person Dan    schedule 10.02.2011    source источник


Ответы (1)


Вы можете сделать это с помощью интерфейса отражения. Найдите «rf_manager» в документации. Но не все задокументировано...

Здесь я проверяю наличие поля baz:

struct foo {
   bar : int;
};

struct baz {
};

extend sys {
   run() is also {
      var f : foo = new;
      var rf_f : rf_struct = rf_manager.get_exact_subtype_of_instance(f);
      var f_bar_field : rf_field = rf_f.get_field("bar");

      if f_bar_field != NULL {
         message(NONE,"struct 'foo' has a field called 'bar'");
      } else {
         message(NONE,"struct 'foo' doesn't have a field called 'bar'");
      };

      var b : baz = new;
      var rf_b : rf_struct = rf_manager.get_exact_subtype_of_instance(b);
      var b_bar_field : rf_field = rf_b.get_field("bar");

      if b_bar_field != NULL {
         message(NONE,"struct 'baz' has a field called 'bar'");
      } else {
         message(NONE,"struct 'baz' doesn't have a field called 'bar'");
      };

   };
};

Это дает

[...]
Starting the test ...
Running the test ...
[0] sys-@0: struct 'foo' has a field called 'bar'
[0] sys-@0: struct 'baz' doesn't have a field called 'bar'

Если вам нужно перебрать поля, выполните следующие действия:

rf_manager.get_exact_subtype_of_instance(whatever).get_declared_fields()
person Ross Rogers    schedule 11.02.2011