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> оно должно представлять имя переменной, а не числовой тип. Вы понимаете проблему? Спасибо за любую помощь

2 ответа

Решение

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

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

Кажется, что после этих двух исправлений макрос работает просто отлично.

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

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

Другие вопросы по тегам