2014-09-21 55 views
1

在我的验证环境中我有不同的寄存器类型,几乎相同的名称,只有索引不同,例如: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 .. 感谢您的帮助。

+1

目前还不清楚你试图通过这个宏达到什么目的。通常,DAC宏在解析期间(不是在运行时)被执行,并且通常应该返回一些字符串,其中包含一些合法的e代码,并且会进一步解析。在这个例子中,我没有看到宏返回任何字符串。 你能否澄清一下你究竟在做什么?预计在运行时会发生什么? – 2014-09-22 09:28:05

+1

嗨尤里,我已经根据你的笔记修正了我的问题并修复了我的问题 – Halona 2014-09-23 06:36:19

+1

我想我可以从你之前提出的问题中得到你想要做的事情。您可能在两种子类型中都定义了相同的字段,您只需进行强制转换即可访问它。在这种情况下,您可以使用反射,但我认为在运行时间性能方面会更昂贵。 – 2014-09-23 09:33:50

回答

2

一个你想要的宏只能传递一个常量值,所以你需要改回<idx'num>

正如Yuri提到的那样,定义为计算宏在编译时被扩展。这意味着您的宏需要为idx获取一个固定值,以便知道为created_reg分配了哪种类型的变量。您想要传递给宏的idx变量的值仅在运行时设置,这太迟了。

+1

嗨都铎王朝,我编辑了这个问题,我已经修复了与as_a(uint)的代码,但我仍然有编译错误.. – Halona 2014-09-23 06:37:54

+1

@Halona我刚刚意识到你想要的是不可能的,因为你需要知道在编译时间你想要的子类型(TIMER_LOAD_0或TIMER_LOAD_1)。你不能使用这个变量。 – 2014-09-23 09:20:42

+0

即使宏与常量(例如'create_reg“timer_load”1“)一起使用,目前仍不清楚预期结果是什么。该宏被声明为,但'timer_load_1'不是一个动作。那么,它应该怎么做?声明一个字段?声明一个局部变量?还要别的吗? – 2014-09-23 11:33:46

相关问题