2016-09-29 34 views
-1

私はUVMでテストベンチを実行しています。

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 

事は強制取得信号C電子です:コンポーネントのrun_phase()課題の一つで、私は、全体のシミュレーションを通る次のループを、開始するfork...join_noneを行います同じ値にする。 bと同じです。,dおよびeと同じです。

新しいトリガーが後であれば、新しい値はランダム化されて強制されますが、再びa == c == eb == d == eが返されます。

$urandom_rangeがパラメータの選択(0〜FF、0〜F)ごとに1回だけ呼び出され、3つのforceコマンドに戻り値が再使用されたようです。


編集:私は、最小限のTB上の問題を再現することができました:http://www.edaplayground.com/x/4_ph

それは問題が消える他のツールを選択し、私が使用しているベンダーの問題のように見えます。


EDIT 2:これはなぜ起こるか私は正確に考え出したていないが、文が連続割り当てのようなものであるという事実に関係しているように見える(すなわち、将来のRHS信号が変化した場合の力のリリース dになるまで、強制的なLHSはそれに従います。これは '='割り当てとは異なります)。

私の推測では、問題は、関数の戻り値をRHSとして使用することにあります。 (私はこの返された値がどの生涯を持っているのかわかりません)

私の場合の解決策は静的寿命を持つ変数に$ urandom値を保存して、その変数をRTLに強制します

+0

http://stackoverflow.com/help/mcve – toolic

+0

投稿したコードは、実際に実行したコードとどのくらい近いですか? –

+0

@ dave_59私はいくつかの文脈で投稿を編集しました。私はEDAのプレイグラウンドでそれを再作成しようとしていますが、私は現時点でアカウントに問題があります – chinocolerico

答えて

1

ランダム変数と制約を持つクラスを使用しないのはなぜですか?

// outside of the test-bench 
class my_stimulus; 
    rand bit [7:0] a, c, e; // can be logic if you like 
    rand bit [3:0] b, d, f; // rand won't give X or Z 

    constraint c1 { 
     unique {a, c, e}; 
     unique {b, d, f};  
    }  
endclass; 

// inside the actual testbench 
my_stimulus to_dut = new; 

fork 
    forever @(posedge trigger) begin 
    if (!(to_dut.randomize()) $error; 
    force dut.a = to_dut.a; 
    ... 
    force dut.f = to_dut.f; 
    end 
... 
join_none 

ユニーク制約は、エラーを引き起こすか、毎回一意の値を与えます。指定されたサイズを指定すると、境界を設定する必要はなくなりますが、別の制約と同様に行うことができます。

1

コードに2つの問題があります。 最初に$ urandom_rangeの引数を逆にしました。 (最大,min)であり、minは省略可能であり、デフォルトは0である。シミュレータによってはこれを理解するものもあるが、標準ではない。

2番目の問題は、繰り返し同じ表現を強制しているためです。シミュレータはそれを新しい式として認識せず、$ urandomを再度呼び出さないかもしれません。各forceの前にreleaseの文を入れてみてください。

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 
+0

逆さまの範囲でうまくキャッチします。 私は信号を解放しようとしましたが、運がありません。実際には、ブロックが再トリガーされると、シグナルは新しいランダム値に更新されます...選択された値が同じであることだけです。 – chinocolerico

0

NCSIMを使ったOPと同じ "urandom_range"という問題が発生しました。しかし、 "urandom"は正常に機能しました。 "urandom_range"ではなく "urandom"があなたのケースでは機能しないという理由はないはずです( "urandom"はもちろん正しく動作すると仮定します)。 "urandom"の結果は単純に切り捨てられます。

背景:誰かが好奇心を抱いているような場合には、NCSIMの "urandom_range"( "urandom_range"ではなく)についてエラーが発生しました。ただし、関数の最初の呼び出しでは常に最小値を返します何。しかしその後のすべての呼び出しは正常に機能しました。

+0

私は私の質問にいくつかの情報を追加しました。 – chinocolerico

関連する問題