Specman On the Fly Generation:如何约束值至少彼此不同的列表 2

Specman On the Fly Generation: How to constrain a list whose values are differ from each other at least 2

我需要使用下一个约束生成一个随机列表值:

my_list[i] not in [my_list[i-1] .. my_list[i-1] + 1]

即列表中的所有值都不同,并且彼此之间至少相差 2。我尝试过的所有代码变体都失败了,例如:

   var prev_val : uint = 0;
   gen my_list keeping {
       it.size() == LIST_SIZE;
       it.all_different(it);

       for each (val) in it {
                val not in [prev_val .. prev_val + 1];
                prev_val = val;
        };
    };

如何生成这样的列表?感谢您的帮助

您可以尝试以下方法:

gen my_list keeping {
  it.size() == 10;
  it.all_different(it);

  for each (val) in it {
    index > 0 => 
       val not in [value(it[index - 1]) .. value(it[index - 1]) + 1];
  };
};

求解器要求约束中的 it[index - 1] 表达式在生成时为 "fixed",因此使用 value(...)。这意味着列表将逐个元素生成。

如果这是一个问题,您可以更改为:

    index > 0 => 
       val != it[index - 1] + 1;

这应该是等价的,因为 all_different(...) 约束应该确保一个元素与前一个元素的值不同。当然,如果你有更广泛的集合,这将不起作用。

我不确定我是否完全理解该请求,但请遵循您的代码:

gen my_list keeping {
    it.size() == LIST_SIZE;
    it.all_different(it);
    keep for each (val) in it {
        val != prev;
        val != prev + 1;
    };
};

这将根据您的规则生成一个列表(所有项目将一起生成):

my_list[i] not in [my_list[i-1] .. my_list[i-1] + 1]

但以下列表是有效的解决方案:0,2,1,3,5,4,6,8,7,9,11,10,12,... 这不符合 "the all values in the list are different and with at least difference of 2 between each other".

要根据 "text request" 生成列表,您必须对每个和 abs 使用双重保留:

gen my_list keeping {
    it.size() == LIST_SIZE;
    for each (val1) using index (i1) in it {
        for each (val2) using index (i2) in it {
            i1 < i2 => abs(val1-val2) >= 2;
    };
};

如果你想让my_list排序(而且会更快解决):

gen my_list keeping {
    it.size() == LIST_SIZE;
    it.size() == LIST_SIZE;
    it.all_different(it);
    for each (val) in it {
        val >= prev + 2;
    };
};