Macros Specman DAC宏:如何定义2个不同类型的输入(uint和string)?

Macros Specman DAC宏:如何定义2个不同类型的输入(uint和string)?,macros,specman,e,Macros,Specman,E,在我的验证环境中,我有不同的寄存器类型,它们的名称几乎相同,只是索引不同,例如:timer\u load\u 0,timer\u load\u 1等。。 我尝试创建一个宏,该宏获取两个参数:string(寄存器的“名称”不带索引)和uint(寄存器的索引),并返回一个“串联”寄存器类型的变量。 例如,我希望命令: my_idx : uint = 0; create_reg "timer_load" my_idx; 将返回变量timer\u load\u 0 我的宏代码: define <

在我的验证环境中,我有不同的寄存器类型,它们的名称几乎相同,只是索引不同,例如:
timer\u load\u 0
timer\u load\u 1
等。。 我尝试创建一个宏,该宏获取两个参数:
string
(寄存器的“名称”不带索引)和
uint
(寄存器的索引),并返回一个“串联”寄存器类型的变量。 例如,我希望命令:

my_idx : uint = 0;
create_reg "timer_load" my_idx;
将返回变量
timer\u load\u 0

我的宏代码

define <var_by_idx'action> "create_reg <name'any> <idx'exp>" as computed {
    var idx : uint = <idx'exp>.as_a(uint);
    result = appendf("%s_%d",<name'any>, idx);  
};
define.as_a(uint);
结果=附录F(“%s\u%d”,.as\u a(uint);
在执行“定义为计算”宏期间:
在@timer_监视器中的第380行
创建“定时器加载”我的idx;
宏无法将
my_idx
识别为
uint
变量,而是识别为
string
。。
谢谢您的帮助。

执行您想要的操作的宏只能传递一个常量值,因此您需要更改回
。不清楚此宏究竟要实现什么。通常,DAC宏是在解析过程中执行的(不是在运行时),它通常会返回一些字符串,其中包含一些合法的e代码,并且会被进一步解析。在本例中,我看不到宏返回任何字符串。请您澄清一下,您到底想在这里做什么?在运行时会发生什么?嗨,Yuri,我已经根据您的说明编辑了我的问题,并进行了修复。我想我知道第二,从前面提出的问题中可以得到您想要做的事情。您可能在两个子类型中定义了相同的字段,并且您只需要强制转换就可以访问它。在这种情况下,您可以使用反射,但在运行时性能方面,我认为这将更加昂贵。如果是这种情况,那么您可能需要st另一个有更多上下文的问题。嗨,都铎,我已经编辑了这个问题,并用as_a(uint)修复了代码,但我仍然有编译错误。@Halona我刚刚意识到你想要的是不可能的,因为你需要在编译时知道你想要的子类型(TIMER_LOAD_0或TIMER_LOAD_1)。您不能为此使用变量。即使宏与常量一起使用(例如“create_reg”timer_load“1”),仍然不清楚预期的结果是什么。宏被声明为,但“timer\u load\u 1”不是一个动作。那么,它实际上应该做什么?声明一个字段?声明一个局部变量?还有什么吗?@YuriTsoglin我想他想从一个reg文件中获取一个特定的寄存器实例,然后将其强制转换到某个子类型,并将其存储在一个变量中那一类的不可靠的。
Error: Looking for a number but found 'my_idx'
                at line 45 in @macros
    var idx : uint = <idx'exp>.as_a(uint);
                during execution of a define-as-computed macro:
                at line 380 in @timer_monitor
            create_reg "timer_load" my_idx;