在SystemVerilog Constraints中调用function(约束中调用函数)的陷阱

这里有一个例子:

class constraint_container;
  rand int unsigned a, b, c;

  function int unsigned get_a();
    return a;
  endfunction

  function int unsigned value_of(int unsigned value);
    return value;
  endfunction

  constraint a_constraint {
    a == 5;
    // I expect "b" to be equal to "a", but, surprise, surprise...
    b == get_a();
    // I expect "c" will be equal to "a"
    c == value_of(a);
  }
endclass

module top;
  initial begin
    automatic constraint_container cc_inst = new();
    void'(cc_inst.randomize());
    $display($sformatf("a: %0d, b: %0d, c: %0d", cc_inst.a, cc_inst.b, cc_inst.c));
  end
endmodule

乍看之下,人们会猜测,所有三个字段都是5,但是实际上会得到如下输出:

OUTPUT:
a: 5, b: 0, c: 5
陷阱:不管种子是多少,b总是等于0!

它看起来像get_a()在RNG生成之前被执行,也就是说当a为0时就执行了。

我能找到的最接近的解释是SystemVerilog IEEE 1800-2012标准,“18.5.12约束中的函数”一章:

函数应该在求解约束之前被调用,并且它们的返回值应该被视为状态变量(state variables)。

处于激活状态的约束中的函数调用以未指定的次序执行未指定的次数(至少一次)。

结论是,约束所使用的函数应该仅基于函数的参数计算结果,而不是基于类成员。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值