Как изменить распределение вероятностей случайных величин SystemVerilog? - PullRequest
3 голосов
/ 19 мая 2010

Это для SystemVerilog. Я знаю, что вы можете указать веса для значений или диапазонов значений в наборе значений, из которых выбирается случайная переменная, но что если вы хотите получить хорошее распределение Гаусса? Как вы пишете такого рода ограничения?

Ответы [ 2 ]

5 голосов
/ 23 октября 2010

Когда вызывается randomize, этот класс будет генерировать значения для переменной «value» с нормальным (гауссовым) распределением, среднее значение и стандартное отклонение которого составляют 100 и 20 соответственно. Я не проверял это много, но это должно работать.

class C;

  int seed = 1;
  rand int mean;
  rand int std_deviation;
  rand int value;

  function int gaussian_dist();
    return $dist_normal( seed, mean, std_deviation );
  endfunction

  constraint c_parameters {
    mean == 100;
    std_deviation == 20;
  }

  constraint c_value { value == gaussian_dist(); }

endclass
2 голосов
/ 16 мая 2013

Поскольку я не могу добавить комментарий, я должен написать что-то похожее на новый ответ, но, вероятно, это не так.

Код, данный Стивом К, не работал в VCS G-2012.09 (с пакетом обновления) из-за следующих проблем:

  1. mean и std_deviation, используемые в gaussian_dist(), не должны быть rand переменными. Я только что инициализировал их в приведенном ниже примере, но их также можно назначить в pre_randomize(), который вызывается перед любой рандомизацией.
  2. gaussian_dist() не разрешено изменять переменные, отличные от локальных для функции. Вызов $dist_normal изменяет seed, поэтому в качестве аргумента для функции можно сделать обходной путь seed.

Вот аналогичный код с разрешенными проблемами:

class C;

  int seed = 1;
  int mean = 100;
  int std_deviation = 20;
  rand int value;

  function int gaussian_dist (int seed);
    return $dist_normal (seed, mean, std_deviation);
  endfunction

  constraint c_value { value == gaussian_dist (seed); }

endclass

Однако недостатком этого кода является то, что новое значение "seed", заданное $dist_normal, выбрасывается, и для последующей рандомизации пользователь должен каким-то образом установить переменную seed (так как с тем же seed значение $dist_normal даст тот же результат).

Одним из вариантов будет использование pre_randomize() или post_randomize() для рандомизации гауссовой переменной вместо помещения ее в блоки constraint.

...