1

在我的验证环境中,我有不同的寄存器类型,名称几乎相同,只是索引不同,例如:timer_load_0timer_load_1。我尝试创建一个获取 2 个参数的宏:(string没有索引的寄存器的“名称”)和uint(寄存器的索引)并返回“连接”寄存器类型的变量。例如我想要这个命令:

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_idxuint变量,而是string.. 感谢您的帮助。

4

1 回答 1

2

执行您想要的操作的宏只能传递一个常量值,因此您需要更改回<idx'num>.

正如 Yuri 提到的,定义为计算的宏在编译时被扩展。这意味着您的宏需要获取一个常量值idx才能知道要为您的created_reg. idx您要传递给宏的变量的值仅在运行时设置,这为时已晚。

于 2014-09-21T10:02:41.063 回答