これは SystemVerilog 用です。確率変数が選択する値のセットで、値の重みまたは値の範囲を指定できることは知っていますが、適切なガウス分布が必要な場合はどうすればよいでしょうか? そのような制約をどのように記述しますか?
9064 次
2 に答える
5
randomizeが呼び出されると、このクラスは、平均と標準偏差がそれぞれ100と20である正規(ガウス)分布の変数「value」の値を生成します。私はこれほどテストしていませんが、動作するはずです。
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
and で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
すると同じ出力が得られるため)。
1 つのオプションは、ガウス変数をブロックに入れる代わりに使用pre_randomize()
またはランダム化することです。post_randomize()
constraint
于 2013-05-16T09:35:24.880 に答える