Макрос Specman DAC: как определить 2 входа разного типа (uint и string)?

в моей среде проверки у меня есть разные типы регистров с почти одинаковым именем, которое отличается только индексом, например: timer_load_0, timer_load_1 и т. д.. Я пытаюсь создать макрос, который получает 2 параметра: string («имя» регистра без его индекс) и uint (индекс регистра) и возвращает переменную типа "конкатенированный" регистр. Например, я хотел бы, чтобы команда:

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. Спасибо за любую помощь.


person Halona    schedule 21.09.2014    source источник
comment
Непонятно, чего именно вы пытаетесь добиться этим макросом. Как правило, макрос DAC выполняется во время синтаксического анализа (а не во время выполнения), и обычно он должен возвращать некоторую строку, содержащую допустимый код e, которая подвергается дальнейшему синтаксическому анализу. В этом примере я не вижу, чтобы макрос возвращал какую-либо строку. Не могли бы вы уточнить, что именно вы пытаетесь сделать здесь? Что ожидается во время выполнения?   -  person Yuri Tsoglin    schedule 22.09.2014
comment
Привет Юрий, я отредактировал свой вопрос с исправлениями в соответствии с вашими заметками   -  person Halona    schedule 23.09.2014
comment
Думаю, я понял, что вы хотите здесь сделать, из вопросов, которые вы задавали ранее. Вероятно, у вас есть одно и то же поле, определенное в обоих подтипах, и вам просто нужно выполнить приведение, чтобы получить к нему доступ. В этом случае вы можете использовать отражение, но я думаю, что это будет дороже с точки зрения производительности во время выполнения.   -  person Tudor Timi    schedule 23.09.2014
comment
Если это так, то, возможно, вы могли бы опубликовать еще один вопрос с дополнительным контекстом.   -  person Tudor Timi    schedule 23.09.2014


Ответы (1)


Макросу, который делает то, что вы хотите, может быть передано только постоянное значение, поэтому вам нужно будет вернуться к <idx'num>.

Как упомянул Юрий, определите, как вычисляемые макросы расширяются во время компиляции. Это означает, что ваш макрос должен получить постоянное значение для idx, чтобы знать, какой тип переменной выделить для вашего created_reg. Значение переменной idx, которое вы хотите передать макросу, устанавливается только во время выполнения, что уже слишком поздно.

person Tudor Timi    schedule 21.09.2014
comment
Привет, Тюдор, я отредактировал вопрос и исправил код с помощью as_a(uint), но у меня все еще есть ошибка компиляции. - person Halona; 23.09.2014
comment
@Halona Я только что понял, что то, что вы хотите, невозможно, потому что вам нужно знать во время компиляции, какой подтип вам нужен (TIMER_LOAD_0 или TIMER_LOAD_1). Вы не можете использовать переменную для этого. - person Tudor Timi; 23.09.2014
comment
Даже если макрос использовался с константой (например, 'create_reg timer_load 1'), все равно не ясно, каков ожидаемый результат. Макрос объявлен как ‹действие›, но 'timer_load_1' не является действием. Итак, что он должен делать на самом деле? Объявить поле? Объявить локальную переменную? Что-нибудь еще? - person Yuri Tsoglin; 23.09.2014
comment
@YuriTsoglin Я думаю, он хочет получить определенный экземпляр регистра из reg-файла, а затем привести его к определенному подтипу и сохранить в переменной этого типа. - person Tudor Timi; 23.09.2014