Specman:为什么DAC宏将类型<some_name'exp>解释为'string'?</some_name'exp>

时间:2014-11-30 08:06:18

标签: macros specman e

我试图写一个DAC macro来获取位列表的名称及其大小,以及整数变量的名称。列表中的每个元素都应该被约束为等于变量中的每个位(两个长度相同),即(对于列表名list_of_bits和变量名foo,它们的长度为{{1 })宏的输出应该是:

4

我的宏代码是:

keep list_of_bits[0] == foo[0:0];
keep list_of_bits[1] == foo[1:1];
keep list_of_bits[2] == foo[2:2];
keep list_of_bits[3] == foo[3:3];

错误我得到了:

define <keep_all_bits'exp> "keep_all_bits <list_size'exp> <num'name> <list_name'name>" as computed {
    for i from 0 to (<list_size'exp> - 1) do {
        result = appendf("%s keep %s[%d] == %s[%d:%d];",result, <list_name'name>, index, <num'name>, index, index);
    };
};

为什么它将 *** Error: The type of '<list_size'exp>' is 'string', while expecting a numeric type ... for i from 0 to (<list_size'exp> - 1) do { 解释为字符串? 谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

DAC宏中的所有宏参数都被视为字符串(重复除外,它们被视为字符串列表)。 关键是宏在语法上纯粹地处理它的输入,并且它没有关于参数的语义信息。例如,在表达式(<exp>)的情况下,宏无法实际计算表达式并在编译时计算其值,甚至无法确定其类型。这些信息在后面的编译阶段得出。

在你的情况下,我会假设大小总是一个常数。因此,首先,您可以对该宏参数使用<num>而不是<exp>,并使用as_a()将其转换为实际数字。 <exp><num>之间的区别在于<num>只允许常数而不是任何表达式;但它仍被视为宏内部的字符串。

另一个要点:你的宏本身应该是一个<struct_member>宏而不是一个<exp>宏,因为这个构造本身是一个struct成员(即一个约束),而不是一个表达式。

还有一件事:确保列表大小完全符合要求,为列表大小添加另一个约束。

因此,改进的宏可能如下所示:

define <keep_all_bits'struct_member> "keep_all_bits <list_size'num> <num'name> <list_name'name>" as computed {
    result = appendf("keep %s.size() == %s;", <list_name'name>, <list_size'num>);
    for i from 0 to (<list_size'num>.as_a(int) - 1) do {
        result = appendf("%s keep %s[%d] == %s[%d:%d];",result, <list_name'name>, i, <num'name>, i, i);
    };

};

答案 1 :(得分:3)

为什么不写没有宏?

keep for each in list_of_bits {
    it == foo[index:index];
};

这应该做同样的事情,但看起来更易读,更容易调试;此外,生成引擎可能会采用更简洁的约束。