почему ссылочные параметры нельзя использовать внутри fork join any / none в системном verilog? - PullRequest
0 голосов
/ 04 июня 2019

использование опорных параметров не может быть использовано внутри fork join any / none в системном verilog ** Ошибка: ../tb/range_xform_driver.sv(28): (vlog-LRM-2295) Аргументы, переданные по ссылке, не могут использоваться внутриблоки fork-join_any или fork_join_none

** Ошибка: ../tb/range_xform_driver.sv(29): (vlog-LRM-2295) Аргументы, передаваемые по ссылке, нельзя использовать в блоках fork-join_any или fork_join_none

1 Ответ

0 голосов
/ 04 июня 2019

Это ограничение LRM (см. Раздел 9.3.2 «Параллельные блоки в LRM 1800-2017»). Причина этого ограничения связана с тем, что время жизни любой переменной, указанной в fork / join_none / Блок join_any должен существовать на протяжении всего жизненного цикла блока fork. Вспомните, что существуют такие виды времени жизни переменных

  • Статический - постоянный и не проблема для этой проблемы
  • Автоматически - существует на время активации блока
  • Динамический - управление памятью объекта класса по активным ссылкам.

Очереди, динамические массивы и ассоциативный массив добавляют другое измерение к вышеуказанному для каждого элемента. Проблема в том, что когда вы передаете переменную по ссылке, у вас нет информации о том, к какому классу хранения относится переменная, чтобы иметь возможность продлить срок ее службы. У вас есть только ссылка на общий тип переменной, который соответствует типу ссылки. Предположим, у вас есть задача с аргументом ref для int, и вы вызываете эту задачу, передавая ей член класса, который является int. Код, который вызывает эту задачу, только передает ссылку на этот int, а не дескриптор класса, которому он принадлежит. та же проблема с передачей элемента массива.

Если компилятор вставляет задачу (заменяя вызов задачи содержимым исходного кода задачи), вы можете обойти это ограничение. Но тогда вы не сможете воспользоваться отдельной компиляцией (компиляция определения задачи на отдельном шаге от компиляции кода, вызывающего задачу).

...