はじめに
rand変数で定義した変数はrandomizeで値が確定します。
withを付けることで、インラインで制約を付けることができますが、class内に宣言した制約とconflictするとrandomizeが失敗します。
softを使用することで、上書き可能な制約を付けることができます。
soft
sample1.sv
softを使わないでconstraintを宣言します。
module top();
class sample;
rand bit [2:0] val;
constraint c{
val == 0;
}
endclass
sample a;
initial begin
a = new();
a.randomize() with {val == 2;}; // Conflictしているのでrandomizeが失敗する。
$display("%d", a.val);
end
endmodule
valはclass sampleの中で0に制約づけられていいますが、randomizeでval == 2の制約がかかっています。この場合、conflictしているのでrandomizeが失敗します。
そこでsoftを付けます。
sample2.sv
module top();
class sample;
rand bit [2:0] val;
constraint c{
soft val == 0;
}
endclass
sample a;
initial begin
a = new();
a.randomize() with {val == 2;}; // randomizeは成功してval == 2となる。
$display("%d", a.val);
end
endmodule
val==2が優先されて、randomizeは成功します。
まとめ
constraint でsoftを使用しました。
コメント