1

UVM でテスト ベンチを実行しています。コンポーネントのrun_phase()タスクの 1 つでfork...join_none、シミュレーション全体を実行する次のループを開始します。

fork
   forever @(posedge trigger) begin
      force dut.a = $urandom_range('h00,'hFF);
      force dut.b = $urandom_range( 'h0, 'hF);
      force dut.c = $urandom_range('h00,'hFF);
      force dut.d = $urandom_range( 'h0, 'hF);
      force dut.e = $urandom_range('h00,'hFF);
      force dut.f = $urandom_range( 'h0, 'hF);
   end

 ...
 some other stuff
 ...
join_none

問題は、信号ac、およびeが同じ値に強制されることです。bdeについても同じです。

後で新しいトリガー ポーズエッジが発生した場合、新しい値がランダム化されて強制されますが、ここでもa == c == eb == d == e.

$urandom_range各パラメーターの選択 (0 から FF、および 0 から F) に対して が 1 回だけ呼び出され、戻り値が 3 つのコマンドで再利用されているように見えforceます。


編集: 最小限の TB で問題を再現できました: http://www.edaplayground.com/x/4_ph

私が使用しているベンダーの問題のようで、他のツールを選択すると問題は解決します。


編集 2: なぜこれが起こるのか正確にはわかりませんが、forceステートメントが継続的な割り当てのようなものであるという事実に関連しているようです (つまり、RHS 信号が将来変更された場合、強制された LHS は、forcerelease d であり、'=' 割り当てとは異なります)。

したがって、関数の戻り値をRHSとして使用することに問題があると思います。(この戻り値の有効期間はわかりません)

私の場合の解決策は、 $urandom 値を静的な有効期間を持つ変数に保存し、その変数を RTL に強制することでした (J Reid が提案したように)。

4

3 に答える 3

1

コードに関する 2 つの問題。最初に $urandom_range への引数を逆にします。それは ( max , min ) であり、minはオプションで、デフォルトは 0 です。一部のシミュレーターはこれを理解しますが、標準ではありません。

2 番目の問題は、同じ式を繰り返し強制しているためです。シミュレーターはそれを新しい式として認識しない可能性があり、$urandom を再度呼び出すことはありません。releaseそれぞれの前にステートメントを入れてみてくださいforce

 forever @(posedge trigger) begin
      release dut.a; force dut.a = $urandom_range('hFF);
      release dut.b; force dut.b = $urandom_range('hF);
      release dut.c; force dut.c = $urandom_range('hFF);
      release dut.d; force dut.d = $urandom_range('hF);
      release dut.e; force dut.e = $urandom_range('hFF);
      release dut.f; force dut.f = $urandom_range('hF);
   end
于 2016-09-30T14:43:55.047 に答える