SV随机化给出了意想不到的值

时间:2018-03-08 07:07:41

标签: system-verilog

我有以下示例代码

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的软约束,除非我们禁用约束或使用相同名称覆盖,否则我们永远不能放松约束值。我期待它放松约束,因为孩子正在放松它。

2 个答案:

答案 0 :(得分:2)

扩展class c不会覆盖class b中的约束;它添加到约束集。由于添加的约束与软约束不冲突,因此软约束保持不变。在可以删除软约束之前,必须没有可能的解决方案。

如果您想放宽约束,则必须覆盖它或禁用它。

答案 1 :(得分:0)

如果您尝试执行,例如c_obj.randomize() with {a inside {[11:100]};};,则c类中的软约束将被内联约束抑制,并将a随机化为11到100之间的值。例如,如果您将代码更改为:

,则保留b类
constraint a_c_1 {
   a inside {[11:100]};
}

在这种情况下,b类中的约束将抑制c类中的软约束,因此b_obj会将a随机化为11到100之间的值。

否则,如果所有这些约束保持原样,由于没有冲突,您将始终在a变量中获得值10。