Почему неблокирующие назначения не разрешены в функциях Verilog?

Я читал, что использование неблокирующих присваиваний запрещено в функциях Verilog. Может ли кто-нибудь предложить правдоподобное объяснение этому?


person Akash    schedule 20.08.2012    source источник


Ответы (2)


Стандарт IEEE для Verilog (1364-2001), раздел «10.3.4 Правила функций» гласит:

Функция не должна иметь неблокирующих назначений.

1800-2009 IEEE Std более подробно описывает это:

Функции должны выполняться без задержек. Таким образом, процесс, вызывающий функцию, должен немедленно вернуться. Операторы, которые не блокируют, должны быть разрешены внутри функции; в частности, внутри функции должны быть разрешены неблокирующие назначения, триггеры событий, приводы синхронизации и конструкции fork-join_none.

Намерение состояло в том, чтобы функции можно было просто оценивать в очереди событий Verilog. Если вам нужно ускорить время, используйте task вместо function.

person toolic    schedule 20.08.2012
comment
Там нет пропавших без вести? неблокирующие назначения ... должны быть разрешены внутри функции. прямо противоречит Функция не должна иметь никаких неблокирующих назначений. - person Eric; 27.07.2018

Старайтесь не думать о функциях в Verilog как о функциях в C:

Функции в Verilog спроектированы так, чтобы быть удобным для разработчиков способом создать экземпляры идентичной комбинационной логики в нескольких местах одновременно, вместо того, чтобы переписывать ее заново / создавать для нее модуль. Многие «новички» в Verilog пытаются рационализировать функции, как будто они являются функциями C, и, хотя они «возвращают» значение, легче (и правильнее) в конечном итоге концептуализировать их как блоки комбинационных вентилей.

Обратите внимание, что это отличается от «задачи», которая обычно используется для выполнения вещей «по порядку», что, вероятно, было бы более полезно в ситуации тестового стенда, чем функция.

По мере того, как вы изучаете Verilog, старайтесь не рационализировать HDL, который вы пишете, как «код», потому что это другой стиль мышления.

РЕДАКТИРОВАТЬ: взял с моей стороны плохое объяснение

person omicron    schedule 20.08.2012
comment
В тестовых стендах все еще не имеет смысла иметь блокирующие назначения в функциях. Функции НЕ являются программными функциями, даже в тестовых стендах. Хотя даже в чем-то вроде SystemVerilog тестовые стенды могут быть очень похожи на программное обеспечение, они все же представляют оборудование, хотя и очень абстрактно. - person omicron; 21.08.2012
comment
Вы неправильно поняли терминологию между блокировкой и неблокировкой. И ваше обоснование сомнительно. Функции unte - person Jan Decaluwe; 24.08.2012
comment
... Функции в первую очередь предназначены для работы как программные. - person Jan Decaluwe; 24.08.2012
comment
Задачи и функции разные. Задачи предназначены для выполнения по порядку, как программное обеспечение. Функции действуют как комбинационная логика. Если вы не пишете Verilog, который живет только в симуляторах, эта разница действительно имеет значение. (Исправлена ​​путаница выше) - person omicron; 24.08.2012
comment
@omicron Функции не имеют побочных эффектов, в отличие от задач (процедур). Чисто программное понятие. - person Jan Decaluwe; 25.08.2012
comment
Вопрос не был специфическим для синтеза, и функции Verilog явно предназначены для имитации функций из таких языков, как C. - person ; 29.08.2012