我有单位字段events
:
events:uint;
events
的值不如其中的设置位数那么有趣。我想约束events
中设置位数的范围。
有办法吗?
谢谢你的帮助。
答案 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的未来版本中。我仍然希望至少看到[..]
和%{}
运算符存在将帮助你做其他事情。