2010-05-18 154 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塊中。