2010-05-18 156 views

回答

5

当调用randomize时,该类将生成具有平均值和标准偏差分别为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 2016-10-19 08:32:27

2

由于我无法添加评论我写了什么看起来像一个新的答案,但可能不是。

由史蒂夫给出K的代码没有在VCS G-2012.09(带service pack)由于以下问题开展工作:

  1. meanstd_deviationgaussian_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块中。