代码之家  ›  专栏  ›  技术社区  ›  Halona

规格e:定义为计算宏错误

  •  1
  • Halona  · 技术社区  · 6 年前

    我在验证环境中的uint列表上有多个相同的约束。我写了一个宏,所以我只能写一次约束,它会将它们扩展到所有其他列表。例如,我想写:

    data_delay          : list of uint;
    req_delay           : list of uint;
    
    keep for each in [data_delay, req_delay] {
        soft it == select {
            1   : [0];      -- Back to back
            5   : [1..5];   -- Short delay
            2   : [5..12];  -- Medium delay
            1   : [13..40]; -- Long delay
        };
    };
    

    宏将复制两个列表的约束 data_delay req_delay 。我编写的宏是:

    define <multi_keep_for'statement> "keep for each in \[<detr'name>,...\] (<MEMBERS>{<struct_member>;...})" as computed {
        for each in <detr'names> do {
            result = appendf("%s keep for each in %s %s", result, it, <MEMBERS>);
        };
    };
    

    但我得到了编译错误:

    The type of 'data_delay' is 'list of uint', while expecting a numeric type
    

    我不明白这个问题-我用过 <detr'name> 它应该表示变量的名称,而不是数字类型。。你理解这个问题吗?谢谢你的帮助

    2 回复  |  直到 6 年前
        1
  •  2
  •   Yuri Tsoglin    6 年前

    宏中有两个错误。 首先,应该是 <struct_member> 而不是 <statement> 。 第二,结果中的项之间缺少分号,它必须是:

    result = appendf("%s; keep for each in %s %s", result, it, <MEMBERS>);
    

    似乎在这两次修正之后,宏运行得很好。

    出现的错误是因为根本没有调用宏(如果尝试在没有宏的情况下加载完全相同的代码,则会出现相同的错误)。

        2
  •  1
  •   Thorsten    6 年前

    由于要在扩展代码中不修改块,可以使用 "keep for each in \[<detr'name>,...\] <block>" 作为匹配表达式。然后使用 <block> 在append语句中。