Specman e:有没有办法限制数字中的设定位数?

时间:2014-11-27 12:22:14

标签: constraints specman e

我有单位字段events

events:uint;

events的值不如其中的设置位数那么有趣。我想约束events中设置位数的范围。 有办法吗? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

操作[..]%{}不具有生成性,因此它们被视为约束中的输入。

约束:

keep events_bits == events[..];

相当于:

keep events_bits == read_only(events[..]);

生成器将生成events,然后才会对`events_bits强制执行约束。

您可以执行以下操作:

extend sys {
    events : uint;
    events_bits_on [32] : list of bool;
    keep for each in events_bits_on {
        it == (events[index:index] == 1);
    };
    keep events_bits_on.count(it) == 2;
};

答案 1 :(得分:2)

可能有一种更简单的方法,但您可以使用位切片来约束一个uints列表以等于变量的位,并使用sum来限制它们的数量。

以下示例可以满足您的需求(为简洁起见,仅限于4位变量):

<'
extend sys {
    events : uint(bits:4);
    b: list of uint(bits:1);
    keep b.size() == 4;

    keep b[0] == events[0:0];
    keep b[1] == events[1:1];
    keep b[2] == events[2:2];
    keep b[3] == events[3:3];

    keep (b.sum(it) == 2);
};
'>

编写所有约束可能有点难看,但可以使用define as computed宏轻松完成。

答案 2 :(得分:1)

这只是部分答案。

您可以使用events[..]%{events}将矢量转换为包含该矢量位的列表。直接在约束中直接使用它不起作用,因为它抱怨没有生成元素:

extend sys {
  events : uint(bits:4);

  // neither of these compile
  keep events[..].sum(it) == value(2);
  keep %{events}.sum(it) == value(2);
};

这可能是Cadence的情况。

然而,允许创建一个中间列表并将其分配给这些运算符的输出:

extend sys {
  events_bits : list of bit;
  keep events_bits == events[..];
};

您会认为您可以将此列表限制为具有一定数量的1:

extend sys {
  // these constraints apply, but aren't enforced
  keep events_bits.sum(it) == value(2);
  keep events_bits.count(it == 1) == value(2);
};

然而,这不起作用。即使存在约束,它们也不会因某种原因而被强制执行。这是Cadence要看的另一个问题。

总结一下,如果不存在这些问题,您可以轻松计算出数量。也许在Specman的未来版本中。我仍然希望至少看到[..]%{}运算符存在将帮助你做其他事情。