3

これは SystemVerilog 用です。確率変数が選択する値のセットで、値の重みまたは値の範囲を指定できることは知っていますが、適切なガウス分布が必要な場合はどうすればよいでしょうか? そのような制約をどのように記述しますか?

4

2 に答える 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 (サービス パックあり) では機能しませんでした。

  1. meanand でstd_deviation使用されるのは変数であってgaussian_dist()はなりません。rand以下の例ではそれらを初期化しましたが、pre_randomize()ランダム化の前に呼び出されるように割り当てることもできます。
  2. gaussian_dist()関数のローカル変数以外の変数を変更することはできません。回避策を関数の引数にできるように、$dist_normal呼び出しが変更されます。seedseed

問題が解決された同様のコードを次に示します。

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 に答える