Specman e: define-as-computed 宏错误
Specman e: define-as-computed macro error
我在我的验证环境中对 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>
它应该代表变量的名称而不是数字类型..你明白这个问题吗?感谢您的帮助
因为你想在你的扩展代码中不修改块,你可以使用 "keep for each in \[<detr'name>,...\] <block>"
作为匹配表达式。然后在附加语句中使用 <block>
。
你的宏有两个错误。
首先 - 它应该是 <struct_member>
而不是 <statement>
。
其次 - 结果中的项目之间缺少分号,它需要是:
result = appendf("%s; keep for each in %s %s", result, it, <MEMBERS>);
看来经过这两次修正后,宏就可以正常工作了。
你得到的错误是因为根本没有调用宏(如果你试图在没有宏的情况下加载完全相同的代码,你会得到同样的错误)。
我在我的验证环境中对 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>
它应该代表变量的名称而不是数字类型..你明白这个问题吗?感谢您的帮助
因为你想在你的扩展代码中不修改块,你可以使用 "keep for each in \[<detr'name>,...\] <block>"
作为匹配表达式。然后在附加语句中使用 <block>
。
你的宏有两个错误。
首先 - 它应该是 <struct_member>
而不是 <statement>
。
其次 - 结果中的项目之间缺少分号,它需要是:
result = appendf("%s; keep for each in %s %s", result, it, <MEMBERS>);
看来经过这两次修正后,宏就可以正常工作了。
你得到的错误是因为根本没有调用宏(如果你试图在没有宏的情况下加载完全相同的代码,你会得到同样的错误)。