Использование переменной super.body () незаконно, поскольку она считается «не объявленной»

#system-verilog #uvm

#system-verilog #uvm

Вопрос:

Я расширил использование my virtual task body() в классе sequence, и в объявлении родительского класса body() я объявил переменную. Однако, при использовании ее в расширенном классе’ body() , я столкнулся с ошибкой компиляции Identifier 'q' has not been declared yet.

Вот пример:

 // Inside a base sequence class
virtual task body();
  byte q [$];
  ... 
  .. // rest of the code
  .
endtask : body


// Inside extended sequence class
virtual task body();
  super.body();

  q.push_back('hFF); // X Compilation error: Identifier 'q' has not been declared yet.

  ... 
  .. // rest of the code
  .

endtask : body
  

Я не вижу никакой логической причины, по которой переменная не была замечена.
Я могу, конечно, объявить ее вне области задачи как члена класса, но я хочу исправить эти незначительные пробелы в моем понимании SV.

Пожалуйста, любая помощь? Заранее спасибо.

Ответ №1:

q является локальной для body задачи в суперклассе. body Задача в производном классе — это другая задача и, следовательно, другая область видимости. Вы не сможете увидеть ее из body задачи в производном классе, так же как вы не смогли бы увидеть ее из любой другой задачи.

Комментарии:

1. Хорошо, если я правильно понял: вызов super.body() не просто копирует / вставляет код предыдущей реализации, но выполняет родительский код body как другую задачу, в которой его переменные выделяются и освобождаются только во время super.body() выполнения?

2. Правильно. Наследование класса касается только членов класса. q является переменной с автоматическим временем жизни,