1

我有单位字段events

events:uint;

的值events不如其中设置的位数那么有趣。我想限制events. 有没有办法做到这一点?谢谢您的帮助。

4

3 回答 3

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;
};
于 2014-12-01T09:52:06.520 回答
2

可能有一种更简单的方法,但您可以使用位切片来限制 uint 列表以等于变量的位,并使用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宏轻松完成。

于 2014-11-27T13:04:53.070 回答
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 的未来版本中。我仍然希望至少看到[..]and%{}运算符的存在会对您有所帮助。

于 2014-11-27T14:08:08.180 回答