Ответ 1
Событие не будет происходить во время выполнения процесса!
Когда процесс пробуждается событием, он запускается до завершения ( "конечный процесс" ) или явного выражения "wait" и переходит в режим сна. Это занимает, как правило, время ZERO. Это означает, что если у вас есть циклы в вашем процессе, они эффективно развернуты полностью, и когда вы синтезируете, вы создадите достаточно аппаратного обеспечения для запуска КАЖДОЙ итерации параллельно. Кроме того, любые процедуры, функции и т.д. Принимают нулевое время - если только они не содержат явного выражения ожидания (в этом случае процесс приостанавливается при "ожидании", как если бы процедура была встроена).
В течение этого процесса все сигналы имеют значение, которое они изначально имели, когда процесс просыпался, и все назначения сигналов сохраняются, что произойдет позже. (Переменные немедленно обновляются, а последующие операторы процесса видят новое значение).
Когда процесс приостанавливается (при "wait" или "end process" ), ничего не происходит до тех пор, пока ВСЕ другие процессы также не приостанавливаются. (Но помните, что все они берут нулевое время!). Если процесс приостанавливается в "конечном процессе", он перезапускается с самого начала, когда его список чувствительности пробуждает его. Если он приостанавливается при явном "ожидании", "wait" будет указывать событие или будущее время, которое перезапустит его после "Wait". (ПРИМЕЧАНИЯ: 1: не смешивайте список чувствительности и стили ожидания в том же процессе! 2: Wait До тех пор, пока какое-либо событие не будет синтезировано (хотя некоторые инструменты могут возражать); Подождите некоторое время только для моделирования)
Затем все назначения сигналов выполняются. Поскольку все процессы спали, это устраняет все условия гонки и временные опасности. Некоторые из этих назначений (например, "1" на часах) заставят события планироваться на чувствительных к ним процессах.
После того, как все назначения сигналов выполнены, время переходит вперед на один бесконечно короткий тик (называемый дельта-циклом), а затем все процессы с запланированными событиями разбужены.
Это продолжается до тех пор, пока не произойдет дельта-цикл, в котором запланированы НЕТ новых событий, и, наконец, симуляция может продвигаться на шаг в реальном времени.
Таким образом,
process(clk)
begin
if rising_edge(clk) then
A <= B;
B <= A;
end if;
end process;
не опасен в VHDL.
Если вам когда-либо понадобится использовать Verilog, имейте в виду, что некоторые из них происходят по-другому, и вы не можете полагаться на тот же уровень предсказуемости результатов моделирования.
В синтезе, конечно же, мы создаем аппаратное обеспечение, которое займет некоторое время для выполнения этого процесса. Тем не менее, синтез и вспомогательные средства (место и маршрут) гарантируют, что они добросовестно подчиняются этой модели или не могут сообщить о том, почему они потерпели неудачу. Например, они суммируют все реальные задержки и проверяют, что сумма меньше указанного периода времени. (Если вы не установили слишком высокую тактовую частоту!).
Итак, до тех пор, пока инструменты сообщают об успехе (и вы устанавливаете временные ограничения, такие как тактовая частота), вы можете притворяться, что вышеуказанная модель "нулевого времени" истинна, а реальное поведение аппаратного обеспечения будет соответствовать симуляции, Гарантированные, запрещающие ошибки инструмента!