内联约束中区分本地数据成员和子类数据成员

时间:2019-01-03 11:00:16

标签: system-verilog

我有一个带有rand数据成员i的类。此类(child)是类parent的成员,该类也具有数据成员i。我想将子类中的i的值限制为与父类中的i的值相同。我想做类似的事情:

c.randomize with {i==this.i;};

,但是this.i似乎没有引用父类的i数据成员。 (为什么?)

我可以这样做:

function void f;
  int dummy = i;
  c.randomize with {i==dummy;};
endfunction

或者这个:

function void f;
  c.randomize with {i==m.blk.p.i;}; // yuck!  
endfunction

但是想知道是否有更好的(内置的,非hacky的)方式来区分两个i

MCVE:

class child;
  rand int i;
endclass

class parent;
  child c = new;
  int i=1;
  function void f;
    c.randomize with {i==this.i;};
  endfunction

endclass

module m;
  initial begin : blk
    parent p = new;
    p.f;
    $display("%p", p);
  end
endmodule

https://www.edaplayground.com/x/2_8P

1 个答案:

答案 0 :(得分:3)

您想要{i==local::i}。参见1800-2017 LRM的18.7.1节

this.i未能达到您期望的原因是这两个规则的组合:

  1. 所有类方法,包括内置的randomize方法,都具有内置的this参数。因此c.method(args)实际上是method(args, c)this成为设置为method的{​​{1}}的局部变量
  2. c子句中的标识符尝试绑定到首先随机化的范围,然后再在调用with的位置进行本地搜索。

因此randomize()i引用相同的类变量,就像您写的一样

this.i