2010-05-18 4 views
3

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

ответ

5

Когда вызывается 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 
+0

Для получения дополнительной информации о различных дистрибутивах, которые могут быть использованы в стандарте systemverilog, см .: http://techblog.karnank.in/constrained-randomisation-in-systemverilog-part-1/ – Joniale

2

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

Код дается Steve K не работал в 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 

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

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