Here are the constraints the solver is unable to solve

int int_q[$] = {0, 1, 2}; rand int q_size; rand int rand_int_q[$]; constraint easy_constraint_c { q_size inside {[3:666]}; rand_int_q.size() == q_size; foreach (rand_int_q[ii]) { rand_int_q[ii] inside {int_q}; } unique {rand_int_q}; }

I've purposely wrote these constraints in a way that q_size seemingly has many options:

q_size inside {[3:666]}; rand_int_q.size() == q_size;

However, these extra constraints should limit q_size (and thus rand_int_q.size()) to be == 3

foreach (rand_int_q[ii]) { rand_int_q[ii] inside {int_q}; } unique {rand_int_q};

if q_size == 3, which is allowed, everything else should fall into place.

However, the constraint solver fails to find this solution, and attempts to solve it with q_size > 3.

integer int_q[3] = '{ 0, 1, 2 };

rand integer rand_int_q[0]; // rand_mode = ON

rand integer rand_int_q[1]; // rand_mode = ON

rand integer rand_int_q[2]; // rand_mode = ON

rand integer rand_int_q[3]; // rand_mode = ON

rand integer rand_int_q[4]; // rand_mode = ON

.

.

.

rand integer rand_int_q[85]; // rand_mode = ON

constraint easy_constraint_c // (from this) (constraint_mode = ON) (testbench.sv:43)

{

unique {rand_int_q[0], rand_int_q[1], rand_int_q[2], rand_int_q[3], rand_int_q[4], rand_int_q[5], rand_int_q[6], rand_int_q[7], rand_int_q[8], rand_int_q[9], rand_int_q[10], rand_int_q[11], rand_int_q[12], rand_int_q[13], rand_int_q[14], rand_int_q[15], rand_int_q[16], rand_int_q[17], rand_int_q[18], rand_int_q[19], rand_int_q[20], rand_int_q[21], rand_int_q[22], rand_int_q[23], rand_int_q[24], rand_int_q[25], rand_int_q[26], rand_int_q[27], rand_int_q[28], rand_int_q[29], rand_int_q[30], rand_int_q[31], rand_int_q[32], rand_int_q[33], rand_int_q[34], rand_int_q[35], rand_int_q[36], rand_int_q[37], rand_int_q[38], rand_int_q[39], rand_int_q[40], rand_int_q[41], rand_int_q[42], rand_int_q[43], rand_int_q[44], rand_int_q[45], rand_int_q[46], rand_int_q[47], rand_int_q[48], rand_int_q[49], rand_int_q[50], rand_int_q[51], rand_int_q[52], rand_int_q[53], rand_int_q[54], rand_int_q[55], rand_int_q[56], rand_int_q[57], rand_int_q[58], rand_int_q[59], rand_int_q[60], rand_int_q[61], rand_int_q[62], rand_int_q[63], rand_int_q[64], rand_int_q[65], rand_int_q[66], rand_int_q[67], rand_int_q[68], rand_int_q[69], rand_int_q[70], rand_int_q[71], rand_int_q[72], rand_int_q[73], rand_int_q[74], rand_int_q[75], rand_int_q[76], rand_int_q[77], rand_int_q[78], rand_int_q[79], rand_int_q[80], rand_int_q[81], rand_int_q[82], rand_int_q[83], rand_int_q[84], rand_int_q[85]};

(rand_int_q[0] inside {int_q});

(rand_int_q[1] inside {int_q});

(rand_int_q[2] inside {int_q});

(rand_int_q[3] inside {int_q});

.

.

.

(rand_int_q[85] inside {int_q});

}

Error-[CNST-CIF] Constraints inconsistency failure

testbench.sv, 83

Constraints are inconsistent and cannot be solved.

Please check the inconsistent constraints being printed above and rewrite

them.

What am I missing and how can I achieve the desired result?

I should mention that in my actual code instead of numbers there are variables.

There's a reason that I want that rand_int_q.size() to be within a range that is sometimes partially illegal.

My wish is that the solver will find the legal solutions for size and choose within them.

Thanks,

Nimrod

edit:

I was able to work around this issue in my own project, however still interested on why the constraint on queue size seems to work independently from other constraints.