Specman e:如何约束all_different'结构列表?

时间:2014-11-18 11:24:02

标签: constraints specman e

我有my_list这样定义:

struct my_struct {
    comparator[2] : list of int(bits:16);
    something_else[2] : list of uint(bits:16);
};
...
my_list[10] : list of my_struct;

禁止comparators在同一索引(0或1)中的所有列表中的 keep my_list.all_different(it.comparator[0]); 相同。当我以这种方式约束它时(例如索引0):

*** Error: GEN_NO_GENERATABLE_NOTIF: 

    Constraint without any generatable element.
    ... 
    keep my_list.all_different(it.comparator[0]);

我收到编译错误:

{{1}}

我怎样才能生成不同的一样?感谢任何帮助

2 个答案:

答案 0 :(得分:2)

当您引用my_list.comparator时,它不会按照您的想法执行。会发生的是它将所有comparator列表连接成一个20位元素列表。通过删除约束并打印它来尝试:

extend sys {
  my_list[10] : list of my_struct;

  run() is also {
    print my_list.comparator;
  };
};

在这种情况下,您可以构建自己的comparator[0]元素列表:

extend sys {
  comparators0 : list of int;
  keep comparators0.size() == my_list.size();
  keep for each (comp) in comparators0 {
    comp == my_list.comparator[index * 2];
  };
  keep comparators0.all_different(it);

  // just to make sure that we've sliced the appropriate elements
  run() is also {
    print my_list[0].comparator[0], comparators0[0];
    print my_list[1].comparator[0], comparators0[1];
    print my_list[2].comparator[0], comparators0[2];
  };
};

您可以在此新列表中应用all_different()约束。为了确保它正常工作,添加以下约束应该会导致矛盾:

extend sys {
  // this constraint should cause a contradiction
  keep my_list[0].comparator[0] == my_list[1].comparator[0];
};

答案 1 :(得分:2)

它也可以一气呵成:

keep for each (elem) in my_list {
  elem.comparator[0] not in my_list[0..max(0, index-1)].apply(.comparator[0]);
  elem.comparator[1] not in my_list[0..max(0, index-1)].apply(.comparator[1]);      
};