在我的验证环境中我有不同的寄存器类型,几乎相同的名称,只有索引不同,例如:timer_load_0
,timer_load_1
等。 我尝试创建一个宏,获取2个参数:string
('name'of该寄存器没有它的索引)和uint
(寄存器的索引)并且返回“连接”寄存器类型的变量。 例如,我想,该命令:Specman DAC宏:如何定义2种不同类型的输入(uint和string)?
my_idx : uint = 0;
create_reg "timer_load" my_idx;
将返回变量timer_load_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);
};
的编译错误,我得到:
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;
宏不承认my_idx
作为uint
变量,但作为string
.. 感谢您的帮助。
目前还不清楚你试图通过这个宏达到什么目的。通常,DAC宏在解析期间(不是在运行时)被执行,并且通常应该返回一些字符串,其中包含一些合法的e代码,并且会进一步解析。在这个例子中,我没有看到宏返回任何字符串。 你能否澄清一下你究竟在做什么?预计在运行时会发生什么? – 2014-09-22 09:28:05
嗨尤里,我已经根据你的笔记修正了我的问题并修复了我的问题 – Halona 2014-09-23 06:36:19
我想我可以从你之前提出的问题中得到你想要做的事情。您可能在两种子类型中都定义了相同的字段,您只需进行强制转换即可访问它。在这种情况下,您可以使用反射,但我认为在运行时间性能方面会更昂贵。 – 2014-09-23 09:33:50