Verilog по своей сути недетерминирован. Это означает, что в общем случае есть несколько возможных результатов моделирования, которые различны, но действительны в соответствии со стандартом.
Чтобы избежать недетерминированного поведения блокируемых всегда блоков, у вас есть для использования неблокирующих назначений для тех переменных, которые используются в других блоках (нелокальных переменных). Более подробный анализ см. В моем блоге на эту тему:
http://www.sigasi.com/content/verilogs-major-flaw
Инструменты синтеза обычно принимают блокирующие назначения для нелокальных переменных в синхронизированных блоках всегда, но это действительно ошибка, поскольку они не могут гарантировать, что синтезированная логика будет вести себя как модель (так как такая модель не является детерминированный).
В отличие от того, что вы услышите от многих других, таких как популярные газеты Клиффа Каммингса, не нужно использовать только неблокирующие назначения для локальных переменных. Блокирующие назначения вполне приемлемы для локальных переменных. Это актуально, поскольку позволяет использовать чисто «переменную» семантику (как в языках программирования) для внутреннего моделирования.
В чисто RTL-моделировании задержки # 1 просто накладные расходы.