Процесс в VHDL реентерабелен?
Возможно ли два или более последовательных запуска процесса в VHDL
?
Что произойдет, если произойдет другое событие (в списке сигналов чувствительности), когда последовательное выполнение процесса не завершено?
Это возможно или мой VHDL
модель для процесса совершенно неверна?
4 ответа
Никаких событий не произойдет, пока процесс запущен!
Когда процесс пробуждается событием, он запускается до завершения ("конечный процесс") или явного оператора "ожидания" и переходит в спящий режим. Это занимает, условно, НУЛЕВОЕ время. Это означает, что если у вас есть циклы в вашем процессе, они эффективно развернуты полностью, и когда вы синтезируете, вы сгенерируете достаточно оборудования, чтобы выполнить КАЖДУЮ итерацию параллельно. Кроме того, любые процедуры, функции и т. Д. Занимают нулевое время - если они не содержат явного оператора "wait" (в этом случае процесс приостанавливается на "wait", как если бы процедура была встроена).
На протяжении всего этого процесса все сигналы имеют значение, которое они изначально имели при пробуждении процесса, и любые назначения сигналов сохраняются, чтобы произойти позже. (Переменные обновляются немедленно; более поздние операторы в процессе видят новое значение).
Когда процесс приостанавливается (в режиме "ожидания" или "завершения процесса"), ничего не происходит, пока ВСЕ другие процессы также не приостановятся. (Но помните, что все они занимают нулевое время!). Если процесс приостанавливается в "конце процесса", он перезапускается с самого начала, когда его список чувствительности вызывает его. Если он приостанавливается при явном "ожидании", то "ожидание" будет указывать событие или будущее время, которое перезапустит его после "Ожидания". (ПРИМЕЧАНИЯ: 1: не смешивать список чувствительности и стили ожидания в одном и том же процессе! 2: ждать, пока какое-либо событие не будет синтезируемым (хотя некоторые инструменты могут возражать); ждать в течение некоторого времени - только симуляция)
Затем выполняются все назначения сигналов. Поскольку все процессы находятся в спящем режиме, это устраняет все условия гонки и временные опасности. Некоторые из этих назначений (например, "1" для часов) будут приводить к планированию событий для чувствительных к ним процессов.
После того, как все назначения сигналов выполнены, время переходит вперед на один бесконечно короткий тик (называемый дельта-цикл), и затем все процессы с запланированными событиями просыпаются.
Это продолжается до тех пор, пока не произойдет дельта-цикл, в котором не запланировано никаких новых событий, и, наконец, симуляция может продвинуться на шаг в реальном времени.
таким образом
process(clk)
begin
if rising_edge(clk) then
A <= B;
B <= A;
end if;
end process;
безвреден в VHDL.
Если вам когда-либо понадобится использовать Verilog, помните, что в некоторых случаях это происходит иначе, и вы не можете полагаться на один и тот же уровень предсказуемости в результатах моделирования.
В синтезе, конечно, мы генерируем аппаратные средства, которые потребуют некоторого реального времени для выполнения этого процесса. Однако инструменты синтеза и бэкэнда (место и маршрут) гарантируют либо точное соблюдение этой модели, либо неудачу, и сообщают, почему они потерпели неудачу. Например, они суммируют все реальные задержки и проверяют, что сумма меньше указанного вами периода времени. (Если вы не установили слишком высокую тактовую частоту!).
Таким образом, в итоге, до тех пор, пока инструменты сообщают об успехе (и вы правильно устанавливаете временные ограничения, например, тактовую частоту), вы можете притвориться, что приведенная выше модель "нулевого времени" верна, и реальное поведение оборудования будет соответствовать моделированию. Гарантировано, за исключением ошибок инструмента!
Когда вы начинаете использовать VHDL (или любой другой HDL в этом отношении), очень важно отбросить все понятия последовательного кода и вместо этого сосредоточиться на потоке данных через оборудование. В аппаратном обеспечении все по сути параллельно (все происходит одновременно), но использует постоянно меняющиеся данные (входные сигналы) для расчета постоянно меняющихся результатов (выходных сигналов)!
Не вдаваясь в более сложные темы, такие как переменные, команды ожидания и т. Д., Все внутри процесса происходит одновременно. Если в одном и том же процессе происходят противоречивые вещи (множественные записи в один и тот же сигнал), побеждает последний оператор в процессе, что часто приводит к путанице в отношении "последовательного" кода в VHDL.
Это работает благодаря тому, что значения присваиваются сигналам. При назначении значения сигналу значение сигнала не изменяется немедленно! Вместо этого назначенное значение запоминается и будет зафиксировано как фактическое значение сигнала позже (при подготовке к следующему дельта-циклу, который фактически является следующим квантом времени).
Поскольку следующий дельта-цикл не начнется до тех пор, пока не завершатся все процессы из предыдущего дельта-цикла, значения сигналов будут меняться только тогда, когда ни один процесс не запущен. Как только все сигналы изменились, начинается следующий дельта-цикл, и будет выполнен любой процесс, чувствительный к одному из измененных сигналов.
Если процесс чувствителен к сигналу, который он также записывает, у вас есть так называемый комбинаторный цикл, например, вентиль, в который выход подает вход. Это (почти) всегда ошибка в вашей схеме, и она обычно приводит к тому, что симуляторы входят в бесконечный цикл дельта-цикла.
Это все, что я сейчас напишу, так как ответ Брайана Драммонда только появился, когда я писал это, но не стесняйтесь оставлять комментарий, и я добавлю еще некоторые детали.
Вы должны прочитать это сообщение в блоге: http://www.sigasi.com/content/vhdls-crown-jewel
Как только процесс начинает выполняться (из-за события), он запускается до завершения, прежде чем любые другие события могут вызвать что-либо еще.