Это для SystemVerilog. Я знаю, что вы можете указывать весы для значений или диапазонов значений в наборе значений, из которых выбирается случайная величина, но что, если вы хотите получить хорошее распределение Гаусса? Как вы пишете такое ограничение?Как изменить распределение вероятностей случайных переменных SystemVerilog?
ответ
Когда вызывается 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
Поскольку я не могу добавить комментарий, я должен написать, что похоже на новый ответ, но, вероятно, нет.
Код дается Steve K не работал в VCS G-2012.09 (с пакетом обновления) в связи со следующими вопросами:
mean
иstd_deviation
используется вgaussian_dist()
не должны бытьrand
переменные. Я только что инициализировал их в приведенном ниже примере, но их также можно назначить вpre_randomize()
, который вызывается перед любыми рандомизациями.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
Однако недостатком этого кода является то, что новое значение «семени» дается $dist_normal
отбрасывается, и для последующей рандомизации пользователя должен установить переменную seed
как-то (поскольку с тем же значением seed
$dist_normal
даст тот же результат).
Одним из вариантов было бы использовать pre_randomize()
или post_randomize()
, чтобы случайным образом использовать переменную Гаусса вместо того, чтобы помещать ее в блоки constraint
.
Для получения дополнительной информации о различных дистрибутивах, которые могут быть использованы в стандарте systemverilog, см .: http://techblog.karnank.in/constrained-randomisation-in-systemverilog-part-1/ – Joniale