配列などの複数のデータに対してrandomizeにおける制約を適用する際、foreachを用いることで、一括で制約を加えることができます。




foreachによる制約実装


ここでは、実装2行目で要素数4の配列を作成し、これらにrandomize()における制約を付与することを行っています。

配列要素へ制約適用:SystemVerilog

class Transaction;
    rand bit [(8-1):0] a[4];
    // random constraint
    constraint c1 {
        foreach (a[i]) {
            (a[i] < 100) -> (a[i+1] > 100);
            (a[i] >= 100) -> (a[i+1] < 100);
        }
    }
endclass
Transaction tr = new();
initial begin
    repeat(10) begin
        if(!tr.randomize()) $finish;
        $display("a[0] : %d,  a[1] : %d,  a[2] : %d,  a[3] : %d", tr.a[0], tr.a[1], tr.a[2], tr.a[3]);
    end
    $finish();
end

配列要素へ制約適用:実行結果

foreach (a[i]) {
    (a[i] < 100) -> (a[i+1] > 100);
    (a[i] >= 100) -> (a[i+1] < 100);
}
----------------------------
a[0] :  50,  a[1] : 127,  a[2] :  66,  a[3] : 195
a[0] :  73,  a[1] : 254,  a[2] :  97,  a[3] : 123
a[0] :  69,  a[1] : 213,  a[2] :  20,  a[3] : 244
a[0] :  66,  a[1] : 148,  a[2] :  45,  a[3] : 172
a[0] :  25,  a[1] : 157,  a[2] :  31,  a[3] : 172
a[0] :  71,  a[1] : 131,  a[2] :   5,  a[3] : 158
a[0] :  16,  a[1] : 217,  a[2] :  30,  a[3] : 177
a[0] :  52,  a[1] : 230,  a[2] :  30,  a[3] : 243
a[0] :  20,  a[1] : 248,  a[2] :  99,  a[3] : 204
a[0] :   6,  a[1] : 208,  a[2] :  81,  a[3] : 243
  • (a[i] < 100) -> (a[i+1] > 100);
  • (a[i] >= 100) -> (a[i+1] < 100);
実装6、7行目において、上記の制約を用いてある要素と次の要素の間の制約を指定しています。

この2つの制約を順序関係なく付与すると、a[0]でかならず100未満となることについては疑問が残りますが、ひとまず、a[i]が100未満の数のとき、a[i+1]の値が100以上。a[i]が100以上の数のとき、a[i+1]の値が100未満という条件が成立していることが分かるかと思います。



randomize制約一覧





参考:
http://japanese.sugawara-systems.com/systemverilog/constraint_random_value_generation.htm

このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット