如何在Specman中生成无连续重复元素的限定范围列表?
在Specman中生成无连续重复元素的限定范围列表
问题分析
你的核心需求是生成满足两个条件的列表:
- 每个元素取值在
[0, mylist_limit)范围内 - 列表中没有连续两个元素值相同(允许非连续的重复元素,如示例中的
[1,0,1,0])
你之前的尝试存在两个关键问题:
- 使用
unique()约束完全偏离需求:该约束要求列表所有元素唯一,但你的需求仅禁止连续重复,这个约束会错误过滤掉合法案例。 - 连续元素比较的索引逻辑错误:你在循环中用
mylist[index] != mylist[index+1],一方面最后一个元素的index+1会触发越界;另一方面逻辑上应该是当前元素和前一个元素不同,而非和下一个元素比较。
正确的约束实现
结合你的范围约束,正确的Specman约束代码如下:
mylist_len : uint; // 列表长度,可提前约束或赋值 mylist_limit : uint; // 元素取值上限,可提前约束或赋值 mylist[mylist_len] : list of uint; // 约束1:每个元素在限定范围内 keep for each (elem) in mylist { elem < mylist_limit; }; // 约束2:无连续重复元素 keep for each (elem) in mylist { if index > 0 { elem != mylist[index-1]; }; };
代码说明
- 范围约束保留你原有的逻辑,确保元素取值符合要求
- 连续元素约束部分:遍历每个元素时,仅当当前元素不是第一个(
index>0),才要求它与前一个元素(mylist[index-1])值不同,既匹配需求又避免了索引越界问题。
内容的提问来源于stack exchange,提问作者Carcophan
相关产品推荐
相关产品推荐

