私はこれらの3つの機能の間で混乱していて、いくつかの説明が必要でした。範囲を設定した場合、範囲を排他的または包括的にするにはどうすればよいですか?範囲を指定しない場合、範囲は包括的ですか、それとも排他的ですか?
@ dave_59からの回答に加えて、他にも重要な違いがあります。
i)$random
は符号付き32ビット整数を返します。 $urandom
および$urandom_range
は、符号なし32ビット整数を返します。
ii)$random
の乱数ジェネレーターは、 IEEE Std 1800-2012 で指定されています。同じシードを使用すると、SystemVerilogシミュレーターでまったく同じ乱数シーケンスを取得できます。 $urandom
および$urandom_range
の場合はそうではなく、乱数ジェネレーターの設計はEDAベンダー次第です。
iii)各スレッドには$urandom
と$urandom_range
の独自の乱数ジェネレーターがありますが、すべてのスレッド間で共有される$random
の乱数ジェネレーターは1つだけです(つまり、シミュレーション全体で1つだけです)。 。スレッドごとに個別の乱数ジェネレーターを使用すると、ランダム安定性と呼ばれるプロパティをシミュレーションで改善できるため、これは非常に重要です。乱数ジェネレーターを使用してランダムな刺激を生成するとします。バグを見つけて修正するとします。これにより、スレッド(つまり、initial
およびalways
ブロック)が実行される順序を簡単に変更できます。その変更によって乱数が生成される順序が変更された場合、バグを修正したためか、刺激が変更されたためにバグがなくなったかどうかはわかりません。スレッドごとに乱数ジェネレーターがある場合、テストベンチはそのような影響に対してはるかに脆弱ではありません。バグを修正したため、バグが消えたことをはるかに確信できます。そのプロパティはランダム安定性と呼ばれます。
したがって、@ dave_59が言うように、$urandom
と$urandom_range
のみを使用する必要があります。
$urandom
と$urandom_range
のみを使用する必要があります。これらの2つの関数は、$random
よりも優れた品質の乱数と、優れたシードの初期化および安定性を提供します。 $ urandom_rangeで指定された範囲は常に包括的です。
$random
は、呼び出しごとにまったく同じ乱数シーケンスを生成しますが、設計またはテストベンチに変更が加えられた直後に同じ呼び出し順序を維持することは非常に困難です。複数のスレッドが同時に乱数を生成している場合はさらに困難になります。