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;
};
};
我需要使用下一个约束生成一个随机列表值:
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;
};
};