这是针对 SystemVerilog 的。我知道您可以在随机变量从中选择的一组值中指定值或值范围的权重,但是如果您想要一个好的高斯分布怎么办?你怎么写这种约束?
问问题
9064 次
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(带有服务包)中不起作用:
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
块中。
于 2013-05-16T09:35:24.880 回答