Взвешенная рандомизация на основе данных времени выполнения в System Verilog - PullRequest
0 голосов
/ 18 ноября 2018

Есть ли способ сделать взвешенную рандомизацию в System Verilog на основе данных времени выполнения. Скажем, у меня есть очередь целых чисел и очередь весов (целые числа без знака), и я хочу выбрать случайное целое число из первой очереди в соответствии с весами во второй очереди.

int data[$] = '{10, 20, 30};
uint_t weights[$] = '{100, 200, 300};

Любая случайная конструкция ожидает весовые коэффициенты, как в

constraint range { Var dist { [0:1] := 50 , [2:7] := 50 }; } 

Но в моем случае мне нужно выбрать элемент из неизвестного числа элементов.

PS: предположим, что количество элементов и вес всегда будут одинаковыми.

1 Ответ

0 голосов
/ 18 ноября 2018

К сожалению, ограничение dist позволяет вам выбирать только из фиксированного числа значений.

Можно выделить два подхода:

  1. Поместить каждое значение данных в очередьиспользуя вес в качестве количества повторений.В вашем примере вы получите очередь из 600 значений.Случайно выбрать индекс в очередь.Выбранный элемент имеет желаемое распределение.Пример размещен здесь .
  2. Создайте массив диапазонов для каждого веса.Для вашего примера массив будет uint_t ranges[][2]'{{0,99},{100,299},{300,599}}.Тогда вы можете сделать следующее в ограничении

    index inside {[0:weights.sum()-1]}; foreach (data[ii]) index inside {[ranges[ii][0]:ranges[ii][1]} -> value == date[ii];

...