Specman e: ошибка макроса «определить как вычисляемый»

У меня есть несколько идентичных ограничений для списков uint в моей среде проверки. Я написал макрос, чтобы я мог написать ограничения только один раз, и он распространит их на все остальные списки. Например, я хотел бы написать:

data_delay          : list of uint;
req_delay           : list of uint;

keep for each in [data_delay, req_delay] {
    soft it == select {
        1   : [0];      -- Back to back
        5   : [1..5];   -- Short delay
        2   : [5..12];  -- Medium delay
        1   : [13..40]; -- Long delay
    };
};

и макрос будет дублировать ограничения для обоих списков data_delay и req_delay. Макрос, который я написал:

define <multi_keep_for'statement> "keep for each in \[<detr'name>,...\] (<MEMBERS>{<struct_member>;...})" as computed {
    for each in <detr'names> do {
        result = appendf("%s keep for each in %s %s", result, it, <MEMBERS>);
    };
};

Но получаю ошибку компиляции:

The type of 'data_delay' is 'list of uint', while expecting a numeric type

Я не понимаю проблемы - я использовал <detr'name>, он должен представлять имя переменной, а не числового типа. Вы понимаете проблему? Спасибо за любую помощь


person Halona    schedule 23.04.2018    source источник
comment
Вы пробовали распечатать результат, чтобы увидеть, как расширяется ваш макрос?   -  person Thorsten    schedule 23.04.2018
comment
@Thorsten, я знал, что это возможно, спасибо   -  person Halona    schedule 23.04.2018
comment
Халона, мне очень нравится этот твой макрос, и я хочу поделиться им с другими людьми. Можете ли вы связаться со мной в автономном режиме?   -  person user3467290    schedule 27.04.2018
comment
@ user3467290, Конечно, как с вами связаться?   -  person Halona    schedule 29.04.2018


Ответы (2)


У вас две ошибки в макросе. Во-первых, это должно быть <struct_member>, а не <statement>. Во-вторых, у вас отсутствует точка с запятой между элементами в результате, она должна быть:

result = appendf("%s; keep for each in %s %s", result, it, <MEMBERS>);

Вроде бы после этих двух исправлений макрос работает просто отлично.

Вы получили ошибку, потому что макрос вообще не был вызван (если вы попытаетесь загрузить точно такой же код без макроса, вы получите ту же ошибку).

person Yuri Tsoglin    schedule 23.04.2018

Поскольку вы хотите, чтобы в расширенном коде блок не изменялся, вы можете использовать "keep for each in \[<detr'name>,...\] <block>" в качестве выражения соответствия. Затем используйте <block> в операторе добавления.

person Thorsten    schedule 23.04.2018
comment
На самом деле, строго говоря, ни <block>, ни {<struct_member>;...} здесь неверны, потому что это блок ограничений, а не действий (по определению, <block> представляет блок действий) или членов структуры. Поскольку для ограничений нет предопределенного синтаксического имени, мы могли бы использовать {<any>;...}. Однако, к счастью (в данном случае), Specman не является строгим в этом отношении, так что любой из этих вариантов работает. - person Yuri Tsoglin; 23.04.2018
comment
В любом случае использование <block> не решит исходную проблему. - person Yuri Tsoglin; 23.04.2018