В specman, как проверить наличие переменной или структурного поля?
Мало что в руководстве для специалиста указывает на то, что можно на лету определить, была ли создана конкретная переменная. (не спрашивая о проверке индекса массива или хеш-членов, что можно сделать с помощью exist ())
Я только заметил, что обсуждение разрешения структуры / имени пути действительно говорит о том, что попытка "сохранить" структурное поле, которое не существует в разрешенном пути, приведет к ошибке и _must_be_ закомментировано...
Моя работа заключается в моделировании модели, постоянно обновляемой несколькими разработчиками электронного кода, и испытательные стенды теряют обратную совместимость всякий раз, когда кто-то просто создает новую переменную для дальнейшего задания параметров построения модели и TCM.
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()