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
問題は、信号a、c、およびeが同じ値に強制されることです。b、d、eについても同じです。
後で新しいトリガー ポーズエッジが発生した場合、新しい値がランダム化されて強制されますが、ここでもa == c == e
とb == d == e
.
$urandom_range
各パラメーターの選択 (0 から FF、および 0 から F) に対して が 1 回だけ呼び出され、戻り値が 3 つのコマンドで再利用されているように見えforce
ます。
編集: 最小限の TB で問題を再現できました: http://www.edaplayground.com/x/4_ph
私が使用しているベンダーの問題のようで、他のツールを選択すると問題は解決します。
編集 2: なぜこれが起こるのか正確にはわかりませんが、forceステートメントが継続的な割り当てのようなものであるという事実に関連しているようです (つまり、RHS 信号が将来変更された場合、強制された LHS は、forceはrelease d であり、'=' 割り当てとは異なります)。
したがって、関数の戻り値をRHSとして使用することに問題があると思います。(この戻り値の有効期間はわかりません)
私の場合の解決策は、 $urandom 値を静的な有効期間を持つ変数に保存し、その変数を RTL に強制することでした (J Reid が提案したように)。