Я читал, что использование неблокирующих присваиваний запрещено в функциях Verilog. Может ли кто-нибудь предложить правдоподобное объяснение этому?
Почему неблокирующие назначения не разрешены в функциях Verilog?
Ответы (2)
Стандарт IEEE для Verilog (1364-2001), раздел «10.3.4 Правила функций» гласит:
Функция не должна иметь неблокирующих назначений.
1800-2009 IEEE Std более подробно описывает это:
Функции должны выполняться без задержек. Таким образом, процесс, вызывающий функцию, должен немедленно вернуться. Операторы, которые не блокируют, должны быть разрешены внутри функции; в частности, внутри функции должны быть разрешены неблокирующие назначения, триггеры событий, приводы синхронизации и конструкции fork-join_none.
Намерение состояло в том, чтобы функции можно было просто оценивать в очереди событий Verilog. Если вам нужно ускорить время, используйте task
вместо function
.
Старайтесь не думать о функциях в Verilog как о функциях в C:
Функции в Verilog спроектированы так, чтобы быть удобным для разработчиков способом создать экземпляры идентичной комбинационной логики в нескольких местах одновременно, вместо того, чтобы переписывать ее заново / создавать для нее модуль. Многие «новички» в Verilog пытаются рационализировать функции, как будто они являются функциями C, и, хотя они «возвращают» значение, легче (и правильнее) в конечном итоге концептуализировать их как блоки комбинационных вентилей.
Обратите внимание, что это отличается от «задачи», которая обычно используется для выполнения вещей «по порядку», что, вероятно, было бы более полезно в ситуации тестового стенда, чем функция.
По мере того, как вы изучаете Verilog, старайтесь не рационализировать HDL, который вы пишете, как «код», потому что это другой стиль мышления.
РЕДАКТИРОВАТЬ: взял с моей стороны плохое объяснение