我有一个带有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
答案 0 :(得分:3)
您想要{i==local::i}
。参见1800-2017 LRM的18.7.1节
this.i
未能达到您期望的原因是这两个规则的组合:
randomize
方法,都具有内置的this
参数。因此c.method(args)
实际上是method(args, c)
,this
成为设置为method
的{{1}}的局部变量c
子句中的标识符尝试绑定到首先随机化的范围,然后再在调用with
的位置进行本地搜索。因此randomize()
和i
引用相同的类变量,就像您写的一样
this.i