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>
в вашем заявлении дополнения.