3

这是针对 SystemVerilog 的。我知道您可以在随机变量从中选择的一组值中指定值或值范围的权重,但是如果您想要一个好的高斯分布怎么办?你怎么写这种约束?

4

2 回答 2

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
于 2010-10-22T23:53:46.397 回答
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块中。

于 2013-05-16T09:35:24.880 回答