в моей среде проверки. У меня разные типы регистров с почти одинаковым именем, которое отличается только индексом, например: timer_load_0
, timer_load_1
и т. Д. Я пытаюсь создать макрос, который получает 2 параметра: string
(«имя» регистр без его индекса) и uint
(индекс регистра) и возвращает переменную типа «конкатенированный» тип. Например, я хотел бы, что команда:Specman DAC macro: Как определить 2 входа различного типа (uint и string)?
my_idx : uint = 0;
create_reg "timer_load" my_idx;
возвращает переменную timer_load_0
.
Мой код макроса:
define <var_by_idx'action> "create_reg <name'any> <idx'exp>" as computed {
var idx : uint = <idx'exp>.as_a(uint);
result = appendf("%s_%d",<name'any>, idx);
};
Ошибка компиляции я получаю:
Error: Looking for a number but found 'my_idx'
at line 45 in @macros
var idx : uint = <idx'exp>.as_a(uint);
during execution of a define-as-computed macro:
at line 380 in @timer_monitor
create_reg "timer_load" my_idx;
Макрос не распознает my_idx
, как uint
переменная, а как string
.. Спасибо за любую помощь ,
Непонятно, что именно вы пытаетесь достичь этим макросом. В общем случае макрос ЦАП выполняется во время разбора (не во время выполнения), и обычно он должен возвращать некоторую строку, которая содержит некоторый юридический e-код, и который далее разбирается. В этом примере я не вижу, чтобы макрос возвращал любую строку. Не могли бы вы прояснить, что именно вы пытаетесь здесь сделать? Что ожидается во время выполнения? –
Привет, Юрий, я отредактировал свой вопрос с исправлениями в соответствии с вашими заметками. – Halona
Я думаю, что я получаю то, что вы хотите сделать здесь, из вопросов, которые вы задавали ранее. Вероятно, у вас есть одно и то же поле, определенное в обоих подтипах, и вам просто нужно сделать бросок, чтобы иметь доступ к нему. В этом случае вы можете использовать отражение, но, по-моему, это будет дорогостоящим с точки зрения производительности во время выполнения. –