I want to write a constraint on a variable “CHOOSE” that depends one a variable “AVAILABLE” with following rules : -
AVAILABLE IS OF 16 BITS
If AVAILABLE ='hFFFF means CHOOSE can be → {0,15} (as each AVAILABLE[0] to AVAILABLE[15] is set )
if AVAILABLE ='hFFF3 means CHOOSE can be → any value {0,15} except 2,3
So it follows that CHOOSE can be value corresponding to the bit positions set in AVAILABLE. Ias there anyway to write it in constraint.
I have another way of doing it through do while loop as shown below.
if(AVAILABLE>0)
begin
do
CHOOSE =$urandom_range(0,15);
while(!AVAILABLE[CHOOSE]); ///will select random value whose bits are set
end
But I want to put it in constraint.Is there any way of doing the same thing in construct.
rand bit [15:0] available;
rand bit [3:0] choose;
constraint c {
foreach(available[i])
(available[i] == 0) -> (choose != i);
solve available before choose;
}
// alternative way, not sure if it compiles lol
constraint b {
available[choose] == 1;
solve available before choose;
}
// same, I prefer this one, ha
constraint a {
available | (1 << choose) == available;
solve available before choose;
}
Thanks for the reply Javatea. The problem with the above solution is that, available need not to be changed as it will be coming from some parameter which has to be fixed.In the above solution “available” will also get randomize which is not required .
It helps to show the declarations of the variables you describe. Also, what happens when AVAILABLE == 0?
class bit [15:0] available;
rand bit [3:0] choose;
bit [3:0] list[$];
function pre_randomize();
list = {};
foreach (available[v]) if (available[v]) list.push_back(v);
endfunction
constraint c { choose inside {list};}
endclass
make sure your requirement clear. if you want to put in a class, rand or not rand doesn’t matter.
class my_item;
rand bit [15:0] available;
rand bit [3:0] choose;
constraint a {
available != 0;
available | (1 << choose) == available;
}
endclass
bit [15:0] AVAILABLE = 'hFF; // given value
my_item item = new();
item.randomize() with (available == AVAILABLE);
if you give me fixed available, and only want to have valid choose, this is good enough.
bit [15:0] available;
bit [3:0] choose;
std::randomize(available) with {available != 0;}; // given some value
std::randomize(choose) with {(available | (1<<choose)) == available;}; // inline randomize
You can use following solution also, although this solution may not work with all compilers. I have tested it works with VCS as it allows rand variable as array index inside constraints.
class array_bits;
bit [15:0] available;
rand bit [3:0] choose;
constraint c {
(available[choose] == 1);
}
endclass
program test;
array_bits c;
initial begin
c = new;
c.available = 16'hf0ff;
repeat (10) begin
assert (c.randomize());
$display("%p",c);
end
end
endprogram
Workaround for compiler would be to try following, as its similar to above expression. This should work with all compilers.