Specman-e:生成所有可能的解决方案?

时间:2019-01-28 14:49:43

标签: specman

重新生成特定结构时,是否有一种简单的方法可以使它在生成满足约束条件的所有可能值之前不生成先前值?

例如,当(重新)生成时:

Start as:
  specman -c 'define TRIES 16; load x;run;' 

<'
struct x {
    data[2] :  list of uint(bits:2);
};
extend sys {
    fu : x;

    run() is also {
        for i from 1 to TRIES do {
            gen fu;
            print fu.data;
        };
    };
};
'>

可能存在4*4 = 16个数据组合,问题在于能否gen 16次并获得16个不同的值。

谢谢。

1 个答案:

答案 0 :(得分:2)

all_different()在这里可以提供帮助。这有点棘手,因为该字段是一个列表。因此,可以使用辅助字段来完成此操作。例如:

struct x {
    data[2]     :  list of uint(bits:2);

    data_as_one :  uint(bits:4);

    keep data[0] == data_as_one[1:0];
    keep data[1] == data_as_one[3:2];
};

extend sys {
    fu : x;

    fus[TRIES] : list of x;
    keep fus.all_different(.data_as_one);

    run() is also {
        for each in fus {
            out(it.data);
        };
    };
};