我有单位字段events
:
events:uint;
的值events
不如其中设置的位数那么有趣。我想限制events
. 有没有办法做到这一点?谢谢您的帮助。
我有单位字段events
:
events:uint;
的值events
不如其中设置的位数那么有趣。我想限制events
. 有没有办法做到这一点?谢谢您的帮助。
这些操作不是生成的[..]
,%{}
因此它们被视为约束中的输入。
约束:
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;
};
可能有一种更简单的方法,但您可以使用位切片来限制 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
宏轻松完成。
这只是部分答案。
您可以使用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%{}
运算符的存在会对您有所帮助。