私はシステムVerilogでは3つの異なる変数をランダムにしようとしていますが、循環的に行います。私は何を意味することは、私は上記の制約で3つの変数SystemVerilogで変数グループの循環ランダム化
rand int a;
rand int b;
rand int c;
constraint c_a{
a inside {1,2};
}
constraint c_b{
b inside {1,2,3,4,5,6};
}
constraint c_c{
c inside {1,2,3}
}
を以下している、すべての3つの変数(2x6x3)の36個の組み合わせの合計がありますされています。
しかし、我々は36のループを実行する場合、そのよう:
repeat(36) begin
this.randomize(a,b,c);
$display("%d %d %d", a,b,c);
end
我々はいくつかの組み合わせが繰り返される可能性があるとして、すべての可能な組み合わせを打つ習慣。したがって私はループを正確に36回実行することにより、これらの組み合わせをすべてヒットする方法を探しています。
私は、それぞれの組み合わせを表現するために、別のランドの変数を宣言し、そのようにそれにrandc使用してこれを行うには強引なやり方を書いた:
int a;
int b;
int c;
randc int k;
constraint c_k{
k inside {[1:36]};
}
repeat(36) begin
this.randomize(k);
// randomizing variable 'a' to one of the 2 values.
if(k<9)
a = 1;
else
a = 2;
// randomizing variable 'b' to one of the 6 values.
case(k)
1,2,3,19,20,21 : b = 1;
4,5,6,22,23,24 : b = 2;
7,8,9,25,26,27 : b = 3;
//
// finishing the sequence
//
endcase
case(k)
// similar case statement for the final variable
endcase
$display("%d, %d, %d", a,b,c);
end
上記の方法ではうまく動作しますが、私には、それは一種のように見えました(大規模な組み合わせには適用できない)忙しいやり方で、これを実現するより洗練された方法があるのだろうかと思っています。
ありがとうございました。
おかげデイブによって制限される可能性があることに注意してください。これを試しているうちに、私が使っているシミュレータでは32ビットまで、あるいはちょうど1の 'int'型が可能です。これは小さいようです。なぜ私はあなたのデータ型を 'int'(私の例では)から 'bit'に変更したのか分かります。 – user3547407
_6-bits_の循環ランダム性に対処する必要があると考えてください。基本的には、すべての可能な解をマップして、それらのうちの1つをランダムに選択する必要がありました。制約ソルバーは何か同様のことをしなければならず、問題はビット数が増えるにつれて指数関数的に増加します。 この問題に対する他のアプローチは、可能なソリューションの正確な数を知る必要があり、制約が複雑になると非常に困難になります。 –