在Specman e中,有没有办法给messagef非权威的message_tag?

时间:2016-01-20 22:27:42

标签: specman verbosity

我制作了2个记录器,每个线程对应一个(THREAD = 2):

lsd_logger[THREADS]      : list of message_logger is instance; 
  keep for each in lsd_logger {
      soft it.tags      == {appendf("DBG%d",index).as_a(message_tag)};
      it.to_file        == appendf("lsd%d.elog", index);
      soft it.verbosity == HIGH;
      it.to_screen == FALSE;
  };

现在我有一个检查器,我想根据当前运行的线程向每个记录器发送一条消息,如下所示:

messagef(appendf("DBG%d",thread).as_a(message_tag), MEDIUM, "this is a message to logger %d",thread);

但是我不断得到关于这不是一个常数冗长的错误。

有没有办法像这样给出message_tag而不是创建一个func来处理打印?

谢谢,

1 个答案:

答案 0 :(得分:3)

不,这是不可能的。消息的标记必须是硬编码的,因此它应该是一个常量标记,而不是任何返回标记的表达式。

您可以通过定义这样的方法来解决问题:

my_message() is {
    case thread {
        0: {
            messagef(DBG0, MEDIUM, "this is a message to logger 0");
           };
        1: {
            messagef(DBG1, MEDIUM, "this is a message to logger 1");
           };
    };
};

然后,如果你想避免用重复代码编写这个非常长的方法(你甚至需要在每次线程数改变时修改),你可以使用define as computed宏,例如:

define <my_message'action> "my_message" as computed {
    items: list of string;
    for i from 0 to THREADS-1 do {
        items.add(appendf("%d: {messagef(DBG%d, MEDIUM, \"this is a message to logger %d\")}", i, i, i));
    };
    result = appendf("case thread { %s }", str_join(items, ";"));
};