如何在特定保留下的列表中生成项目

时间:2015-03-12 12:34:59

标签: list specman

我想在特定限制下生成列表中的项目。例如:

  dup_offset: list of uint(bits:5);
  keep dup_offset.size() == 3;

  foo_gen() is { 
     for each in dup_offset {
        gen dup_offset[index] keeping {
            read_only(index == 0) => it <= 21;
            read_only(index == 1) => it < dup_offset[0];
            read_only(index == 2) => it < dup_offset[0];
            read_only(index == 2) => it < dup_offset[1];
        };
     };
  }; 

列表是一个全局变量,生成在gen_foo()中完成。 它不会以我编写的方式编译。 任何人都可以建议我该怎么做?

2 个答案:

答案 0 :(得分:1)

&#39; gen keep&#39;构造不能用于列表项。 您仍然可以使用关键字&#39; prev&#39;来建模您的约束。 如果我理解正确,您希望所有商品的值都小于或等于21,并且每件商品都会小于之前的商品。

  !dup_offset: list of uint(bits:5);

  foo_gen() is { 
     gen dup_offset keeping {
         it.size() == 3;
         for each in it {
             it <= 21; //all items will be <= 21
             (prev == 0 ? (it == 0) : (it < prev)); // each items is smaller than the previous item
         };
     };
  }; 

答案 1 :(得分:0)

在编写约束时,可以将代码重写为:

!dup_offset: list of uint(bits:5);
keep dup_offset.size() == 3;
keep for each in dup_offset {
    index == 0 => it <= 21;
    index == 1 => it < prev;
    index == 2 => it < dup_offset[0];
    index == 2 => it < prev;
};    

foo_gen() is { 
    gen dup_offset;
}; 

请注意,您可以删除keep for each中的第三个约束,因为它会立即隐含在第二个和第四个约束的组合中。

但是,如果我正确理解您的要求 - 您需要减少一系列小于21的元素 - 那么约束可以重写如下:

!dup_offset: list of uint(bits:5);
keep dup_offset.size() == 3;
keep for each (a) using index (ind1) in dup_offset {
    ind1 == 0 => a <= 21;
    for each (b) using index (ind2) in dup_offset {
        ind1 > ind2 => a < b;
    };
};


foo_gen() is { 
    gen dup_offset;
}; 

请注意,现在模型不再取决于列表的大小 - 使列表更大不需要添加任何更多约束。