Как уже было сказано, не все блоки являются синтезируемыми. Есть также некоторые блоки, которые будут приняты инструментами синтеза, но которые будут давать результаты, которые отличаются от того, что будет создавать симулятор.
Сначала от списка чувствительности. Обычное правило состоит в том, что оно должно либо содержать только конструкции обнаружения краев (и, как правило, существует ограниченный выбор возможных комбинаций), либо оно должно содержать (возможно, с помощью * или systemverilog's Always_comb) каждый сигнал, используемый в качестве входа в блок. Мы называем первый комбинаторным блоком, а второй - последовательным или блоком. Как правило, если вы включите только подмножество входов в инструменты комбинаторного синтеза блоков, вы просто проигнорируете вас и будете действовать так, как если бы был указан полный список (создавая несоответствия моделирования / синтеза)
Второе блокирование против назначений без блокировки. В комбинаторном блоке разница не имеет большого значения, но в последовательном блоке она имеет большое значение.
В последовательном блоке неблокирующие назначения моделируют регистр достаточно напрямую, в то время как блокируют переменные модели назначений (что может или не может подразумевать регистры в зависимости от порядка установки и чтения). Как правило, набор "reg", использующий блокирующие назначения в последовательном блоке, должен читаться только в одном и том же блоке, а блокирующие и неблокирующие назначения не должны смешиваться в одном и том же "reg".
Смешение блокирующих и неблокирующих назначений для одного и того же элемента может привести к ошибкам синтеза. Создание блокировки блока в одном блоке и чтение его в другом может вызвать несоответствия моделирования / синтеза (и, возможно, даже несоответствия между различными прогонами моделирования).
Теперь у нас есть основные правила, с помощью которых мы можем рассмотреть, как компилятор превращает код в логику.
Первый шаг - развернуть все петли. Это означает, что циклы должны иметь максимальное количество итераций, которое можно определить во время синтеза, иначе вы получите ошибку синтеза.
Затем инструмент может проанализировать поток управления блока и превратить его в поток данных. Каждая переменная становится одним или несколькими сигналами. Каждый оператор if или аналогичная конструкция становятся одним или несколькими мультиплексорами, выбирающими, какой набор результатов будет фактически использоваться.
Инструмент тогда, вероятно, попытается применить некоторые варианты.
В Quartus вы можете увидеть результаты этого процесса после построения вашего проекта, зайдя в «tools-> netlist viewers-> rtl viewer».
После генерации этого структурного представления в терминах абстрактных логических элементов инструмент перейдет к отображению этих абстрактных элементов на ресурсы, которыми фактически обладает чип.
block of code
это ..