我有以下示例代码
class c;
rand int a;
constraint a_c {
soft a == 10;
}
function void post_randomize();
$display("From c the random value is %0d\n", a);
endfunction
endclass
class b extends c;
constraint a_c_1 {
a inside {[10:100]};
}
function void post_randomize();
$display("From b the random value is %0d\n", a);
endfunction
endclass
module m;
c c_obj;
b b_obj;
initial begin
c_obj = new();
b_obj = new();
repeat (100) begin
c_obj.randomize() with {a inside {[10:100]};};
b_obj.randomize();
end
end
endmodule
//两个随机化都给出10。
因此,如果基类具有固定10的软约束,除非我们禁用约束或使用相同名称覆盖,否则我们永远不能放松约束值。我期待它放松约束,因为孩子正在放松它。
答案 0 :(得分:2)
扩展class c
不会覆盖class b
中的约束;它添加到约束集。由于添加的约束与软约束不冲突,因此软约束保持不变。在可以删除软约束之前,必须没有可能的解决方案。
如果您想放宽约束,则必须覆盖它或禁用它。
答案 1 :(得分:0)
如果您尝试执行,例如c_obj.randomize() with {a inside {[11:100]};};
,则c类中的软约束将被内联约束抑制,并将a
随机化为11到100之间的值。例如,如果您将代码更改为:
constraint a_c_1 {
a inside {[11:100]};
}
在这种情况下,b类中的约束将抑制c类中的软约束,因此b_obj
会将a
随机化为11到100之间的值。
否则,如果所有这些约束保持原样,由于没有冲突,您将始终在a
变量中获得值10。