Macros Specman:为什么DAC宏将类型

Macros Specman:为什么DAC宏将类型,macros,specman,e,Macros,Specman,E,我正在尝试编写一个DAC宏,它将获取位列表的名称及其大小,以及整数变量的名称作为输入。列表中的每个元素都应限制为等于变量中长度相同的每一位,即对于列表名list_of_bits和变量名foo,其长度为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]; 我的宏

我正在尝试编写一个DAC宏,它将获取位列表的名称及其大小,以及整数变量的名称作为输入。列表中的每个元素都应限制为等于变量中长度相同的每一位,即对于列表名list_of_bits和变量名foo,其长度为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];
我的宏代码是:

我得到的错误是:


为什么解释DAC宏中的所有宏参数都被视为字符串,重复除外,重复被视为字符串列表。 关键是宏纯粹从语法上处理其输入,并且没有关于参数的语义信息。例如,对于表达式,宏无法在编译时实际计算表达式并计算其值,甚至无法确定其类型。这些信息将在以后的编译阶段得到解决

在你的例子中,我假设大小总是一个常数。因此,首先,您可以对该宏参数使用而不是,并使用as_a将其转换为实际数字。和之间的区别是只允许常量,而不允许任何表达式;但它在宏中仍然被视为字符串

另一个要点是:宏本身应该是宏而不是宏,因为此构造本身是结构成员,即约束而不是表达式

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

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

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);
    };

})

DAC宏中的所有宏参数都被视为字符串,重复除外,重复被视为字符串列表。 关键是宏纯粹从语法上处理其输入,并且没有关于参数的语义信息。例如,对于表达式,宏无法在编译时实际计算表达式并计算其值,甚至无法确定其类型。这些信息将在以后的编译阶段得到解决

在你的例子中,我假设大小总是一个常数。因此,首先,您可以对该宏参数使用而不是,并使用as_a将其转换为实际数字。和之间的区别是只允许常量,而不允许任何表达式;但它在宏中仍然被视为字符串

另一个要点是:宏本身应该是宏而不是宏,因为此构造本身是结构成员,即约束而不是表达式

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

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

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);
    };

})

为什么写不带宏

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

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

为什么不使用没有宏的write

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

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

你好,Specman中存在一些缺陷,当我使用这种方式时,约束不起作用,代码被编译并成功运行,但是列表的值和变量的位是不同的。您是否尝试跟踪/调试它?这种形式的约束是非常基本的,可能是由于某些原因导致值不同,例如稍后的赋值,这可能会阻止宏按预期工作。如果它真的是一个Specman错误,值得向Specman支持部门报告,所以它有望很快得到修复。太棒了!然而,您最初对Hi-Rodion的问题是,Specman中存在一些缺陷,当我使用这种方式时,约束不起作用,代码被编译并成功运行,但是list的值和变量的位是不同的。您是否尝试跟踪/调试它?这种形式的约束是非常基本的,可能是由于某些原因导致值不同,例如稍后的赋值,这可能会阻止宏按预期工作。如果它真的是一个Specman错误,值得向Specman支持部门报告,所以它有望很快得到修复。太棒了!然而,你最初的问题