То, что вы написали, эквивалентно
constraint three_ones {
int'(array[0]) + int'(array[1]) + int'(array[2]) + ... + int'(array[31]) )
== 3;
}
endclass
Обновление
Чтобы сделать это программно без каких-либо функций, вы можете создать другой массив со списком индексов, который должен быть установлен в единицу.Размер массива - это число, которое вы хотите установить.
bit [0:255] array;
int countones = 5;
rand int unsigned bitset[];
constraint c_bits { bitset.size == countones;
foreach(bitset[i]) bitset[i] inside {[0;$bits(array)-1];
unique {bitset};
}
function void post_randomize();
array = 0;
foreach(bitset[i]) array[bitset[i]] = 1'b1;
endfunction
Теперь есть способ сделать это без уникального ограничения и без post_randomize, но для меня это слишком много.