开发者

How to change the probability distribution of SystemVerilog random variables?

This is for SystemVerilog. I know you can specify weights for values, or ranges of values, in the set of values that a random variable chooses from, but what if you wa开发者_如何学运维nt a nice Gaussian distribution? How do you write that kind of constraint?


When randomize is called, this class will generate values for variable "value" with a normal (Gaussian) distribution whose mean and standard deviation are 100 and 20, respectively. I haven't tested this much but it should work.

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


As I'm unable to add a comment I've to write what looks like a new answer but probably isn't.

The code given by Steve K didn't work in VCS G-2012.09 (with service pack) due to the following issues:

  1. mean and std_deviation used in gaussian_dist() should not be rand variables. I have just initialised them in the example below, but they can also be assigned in pre_randomize() which is called before any randomisations.
  2. gaussian_dist() is not allowed to modify variables other than those local to the function. The $dist_normal call modifies seed so as a workaround seed can be made into an argument for the function.

Here is similar code with the issues resolved:

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

However the drawback of this code is that the new "seed" value given by $dist_normal is thrown away, and for a subsequent randomisation the user has to set the seed variable somehow (since with the same seed value $dist_normal would give the same output).

One option would be to use pre_randomize() or post_randomize() to randomise a Gaussian variable instead of putting it in constraint blocks.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜