如何在Specman中为列表实现has_each约束功能?
Specman约束实现:确保ListA所有元素存在于ListB中
你的需求是让ListA的所有元素都能在ListB中找到,同时避免和ListB的其他位置约束冲突。之前的写法强制绑定ListB的前几个位置,必然会和ListB[0] > 10这类约束冲突;而你尝试的read_only(ListA) in ListB是检查整个ListA作为子序列存在,并非单个元素的存在性,所以不生效。
可行解决方案
使用for each遍历ListA的每个元素,约束每个元素都存在于ListB中,不限制具体位置:
ListA : list of uint; keep ListA.size() == 3; keep for each in ListA { it < 10; }; ListB : list of uint; keep ListB.size() == 8; // 核心约束:ListA的每个元素都在ListB中存在 keep for each (elem) in ListA { elem in ListB; }; // 示例其他约束,不会与核心约束冲突 keep ListB[0] > 10; };``` ### 说明 - 这个约束会遍历ListA的每一个元素`elem`,确保`elem`是ListB中的成员之一,不限制`elem`在ListB中的具体位置,因此不会和针对ListB特定位置的约束产生冲突。 - 如果你需要保证ListA的元素在ListB中至少出现一次(允许重复),这个写法完全满足;如果需要ListA元素在ListB中唯一对应,可以额外添加约束限制ListB中重复元素的情况。 内容的提问来源于stack exchange,提问作者Ank
相关产品推荐
相关产品推荐

