randc
делает именно это. (cycli c randomization)
class A;
randc bit[7:0] m;
endclass
Каждый раз, когда вы вызываете randomize()
для одного и того же объекта, он не будет повторять значение для m
, пока не будут заданы все возможные значения.
Симуляторы имеют ограничения на то, насколько большим может быть значение cycli c, но стандарт требует минимум 8 бит. Если у вас есть большее значение, то вы можете использовать оператор inside
.
class A;
rand bit[23:0] r;
bit [23:0] list[$];
constraint c { !(r inside {list}); }
function void post_randomize();
list.push_back(r);
endfunction
endclass
Если вы действительно ожидаете циклического перемещения по списку, сначала может быть проще построить список, а затем shuffle
через список.
bit [7:0] list[20];
for(int i=0;i<20;i++) list[i] = i+10; // range 10-29
list.shuffle();
// cycle through list[0] ... list[29]
list.shuffle();
// cycle through list[0] ... list[29]