Различение локального элемента данных и элемента данных дочернего класса во встроенном ограничении - PullRequest
0 голосов
/ 03 января 2019

У меня есть класс с 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

но не знаете, есть ли лучший (встроенный, не хакерский) способ различения двух 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 голосов
/ 03 января 2019

Вы хотите {i==local::i}.См. Раздел 18.7.1 LRM 1800-2017

Причина, по которой this.i не выполняет то, что вы ожидаете, заключается в комбинации этих двух правил:

  1. всех методов класса, включаявстроенный метод randomize, имеет встроенный аргумент this.Таким образом, c.method(args) на самом деле method(args, c) и this становится локальной переменной для method, для которого установлено значение c
  2. Идентификаторы в предложении with пытаются связать с областью видимостисначала рандомизируется перед локальным поиском в точке, где вызовы randomize().

Так что i и this.i ссылаются на одну и ту же переменную класса так же, как если бы вы написали

class A;
 bit i;
 function void method;
    i = 1;
    this.i = 2;
 endfunction
endclass 
...