рандомизировать количество единиц в массиве в UVM без использования $ countones? - PullRequest
0 голосов
/ 08 февраля 2019

В UVM я хочу ограничить массив так, чтобы я мог зафиксировать число единиц в массиве до 3, я написал следующий код, используя ограничение, использующее $ countones, но как это сделать без использования $ countones??

class class_1;
rand bit[31:0] array;

constraint three_ones {
$countones(array) == 3;
}
endclass

1 Ответ

0 голосов
/ 08 февраля 2019

То, что вы написали, эквивалентно

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, но для меня это слишком много.

...