Я читал эту страницу http://www.asic-world.com/verilog/verilog_one_day3.html, когда наткнулся на следующее:
Обычно мы должны сбрасывать триггеры, поэтому каждый раз, когда часы переходят от 0 к 1 (позиция), мы проверяем, установлен ли сброс (синхронный сброс), затем мы продолжаем с нормальной логикой. Если мы посмотрим внимательнее, то увидим, что в случае комбинационной логики у нас было «=» для присваивания, а для последовательного блока у нас был оператор «<=». Ну, «=» - это блокирующее назначение, а «<=» - это неблокирующее назначение. «=» выполняет код последовательно внутри начала / конца, тогда как неблокирующая «<=» выполняется параллельно.
Я был совершенно уверен, что неблокирующие назначения были последовательными, в то время как блокирующие назначения были параллельными. В конце концов, вы можете делать блокирующие присваивания с помощью операторов присваивания вне блоков всегда, и все они выполняются параллельно. Это ошибка, или поведение внутри блока всегда отличается? И, если поведение внутри блока всегда отличается, могут ли быть сделаны неблокирующие назначения вне блока всегда?
assign
операторы встречаются вне всегда блоков и обычно используются для описания комбинаторной (незапираемой) логики (в то время как всегда блоки, за некоторыми исключениями, описывают последовательную логику). AFAIK,assign
операторы всегда выполняются «параллельно» всякий раз, когда их LHS изменяет значение.Операторы присваивания не являются ни «блокирующими», ни «неблокирующими», они «непрерывны». Выходные данные оператора присвоения всегда равны указанной функции его входов. «блокирующие» и «неблокирующие» назначения существуют только внутри всегда блоков.
Назначение блокировки вступает в силу сразу же после его обработки. Неблокирующее присвоение происходит в конце обработки текущей «дельты времени».
Блоки всегда могут использоваться для моделирования комбинаторной или последовательной логики (systemverilog имеет Always_comb и Always_ff, чтобы сделать это явным). При моделировании комбинаторной логики обычно более эффективно использовать =, но обычно это не имеет значения.
При моделировании последовательной логики (например, всегда @ (posedge clk)) вы обычно используете неблокирующие выражения. Это позволяет определить «состояние после фронта часов» в терминах «состояние до фронта часов».
Иногда полезно использовать блокирующие назначения в последовательных блоках всегда как «переменные». Если вы сделаете это, то должны помнить о двух ключевых правилах.
Нарушение этих правил может привести к сбоям синтеза и / или поведенческим различиям между симуляцией и синтезом.
источник
Термин « блокирующее назначение» сбивает с толку людей, поскольку кажется, что слово « блокировка» предполагает последовательную логику. Но в синтезированной логике это не означает , что все работает параллельно .
Возможно, менее запутанным термином было бы немедленное назначение , которое все же отличало бы промежуточные результаты комбинационной логики от входных данных для непрозрачных элементов памяти (например, синхронизированных регистров), которые могут иметь отложенное назначение .
С юридической точки зрения все работает очень хорошо. Вы можете, на самом деле, рассмотрим
=
быть блокирование (время последовательного) операции даже в пределахalways_comb
последовательностей. Тем не менее, различие между последовательным по времени и параллельным не делает абсолютно никакой разницы в этом случае, потому чтоalways_comb
блок определен для повторения до тех пор, пока последовательность команд не сойдет в стабильное состояние - что именно и будет делать аппаратная схема (если она соответствует времени требования).Синтезируемое подмножество Verilog (и особенно SystemVerilog) чрезвычайно просто и легко в использовании - если вы знаете необходимые идиомы. Вы просто должны отказаться от умного использования терминологии, связанной с так называемыми поведенческими элементами в языке.
источник
initial
операторам внутриprogram
блоков, использует (последовательное по времени) назначение блокировки исключительно. Это полезно для разработки тестового стенда , но обычно не для спецификации RTL.