Построение минимального, полного и проверяемого примера, содержащего ваш процесс:
library ieee;
use ieee.std_logic_1164.all;
entity sequent_exec is
end entity;
architecture foo of sequent_exec is
signal a: std_ulogic := '1';
signal b, c: std_ulogic := '0';
signal clk: std_ulogic := '0';
begin
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
if now > 200 ns then
wait;
end if;
end process;
DUT:
process(clk) is
begin
if rising_edge(clk) then
a <= b ;
b <= c ;
c <= a;
end if;
end process;
end architecture;
Мы видим значения сдвига a, b и c от одного к другому как регистр сдвига с рециркуляцией:
Почему это происходит, зависит от того, как работает цикл симуляции VHDL.
См. IEEE Std 1076-2008
10.5 Простые назначения сигналов (10.5.1 Общие положения):
Оператор назначения сигналов изменяет проецируемые выходные сигналы, содержащиеся в драйверах одного или нескольких сигналов (см. 14.7.2), планирует силу для одного или нескольких сигналов или планирует выпуск одного или нескольких сигналов (см. 14.7.3). ).
Назначение сигнала ставит в очередь новое значение для обновления сигнала. Как работает очередь прогнозируемого выходного сигнала, описано в 10.5.2.2 Выполнение простого оператора присваивания:
Оценка элемента формы сигнала приводит к одной транзакции. Компонент времени транзакции определяется текущим временем, добавленным к значению выражения времени в элементе формы волны. Для элемента формы сигнала первой формы компонент значения транзакции определяется выражением значения в элементе сигнала.
Назначение без выражения времени относится к текущему времени моделирования. (Произойдет дельта-цикл - цикл симуляции без увеличения времени симуляции). Последовательность транзакций описана в
10.5.2.2 сообщить нам, что старые транзакции к тому же времени симуляции удалены.
Это означает, что есть только одна запись в очереди для любого времени моделирования и объясняет, почему последнее присвоение определенному сигналу является результатом, приводящим к транзакции (и создающей событие для сигнала, к которому чувствителен процесс).
14.7 Выполнение модели содержит информацию о том, как работает цикл моделирования (14.7.5 Выполнение модели).
14.7.5.1 Общее:
Выполнение модели состоит из фазы инициализации, за которой следует повторное выполнение операторов процесса в описании этой модели. Каждый такой повтор называется циклом моделирования. В каждом цикле вычисляются значения всех сигналов в описании. Если в результате этого вычисления событие происходит с данным сигналом, операторы процесса, чувствительные к этому сигналу, возобновят работу и будут выполнены как часть цикла моделирования.
14.7.5.3 Цикл моделирования описывает цикл моделирования, здесь используется стандарт IEEE 1076-1993 для простоты, чтобы не загромождать действия VHPI:
12.6.4 Цикл моделирования
Выполнение модели состоит из фазы инициализации, за которой следует повторное выполнение операторов процесса в описании этой модели. Каждый такой повтор называется циклом моделирования. В каждом цикле вычисляются значения всех сигналов в описании. Если в результате этого вычисления событие происходит с данным сигналом, операторы процесса, чувствительные к этому сигналу, возобновят работу и будут выполнены как часть цикла моделирования.
В начале инициализации текущее время Tc принимается равным 0 нс.
Фаза инициализации состоит из следующих шагов:
- Расчетное значение и эффективное значение каждого явно объявленного сигнала вычисляются, а текущее значение сигнала устанавливается на эффективное значение. Предполагается, что это значение было значением сигнала в течение бесконечного промежутка времени до начала симуляции.
- Значение каждого неявного сигнала в форме S'Stable (T) или S'Quiet (T) установлено в True. Значение каждого неявного сигнала вида S'Delayed (T) устанавливается равным начальному значению его префикса S.
- Значение каждого неявного сигнала GUARD устанавливается на результат вычисления соответствующего защитного выражения.
- Каждый неотложенный процесс в модели выполняется до тех пор, пока он не приостановится.
- Каждый отложенный процесс в модели выполняется до тех пор, пока он не приостановится.
- Время следующего цикла моделирования (которое в данном случае является первым циклом моделирования), Tn, рассчитывается в соответствии с правилами шага f цикла моделирования, приведенными ниже.
Цикл моделирования состоит из следующих шагов:
а. Текущее время Tc установлено равным Tn. Симуляция завершается, когда Tn = TIME'HIGH, и в Tn нет активных драйверов или возобновлений процессов.
б. Каждый активный явный сигнал в модели обновляется. (В результате на сигналах могут происходить события.)
с. Каждый неявный сигнал в модели обновляется. (В результате на сигналах могут происходить события.)
д. Для каждого процесса P, если P в настоящее время чувствителен к сигналу S и если в этом цикле моделирования произошло событие S, то P возобновляется.
е. Каждый неотложенный процесс, который возобновился в текущем цикле моделирования, выполняется до тех пор, пока не будет приостановлен.
е. Время следующего цикла моделирования, Tn, определяется путем установки его на самое раннее из
- TIME'HIGH,
- В следующий раз, когда драйвер станет активным, или
- В следующий раз, когда процесс возобновится.
- Если Tn = Tc, то следующий цикл моделирования (если есть) будет дельта-циклом.
г. Если следующий цикл симуляции будет дельта-циклом, оставшаяся часть этого шага пропускается. В противном случае каждый отложенный процесс, который возобновился, но не был выполнен с момента его последнего возобновления, выполняется до его приостановки. Затем Tn пересчитывается по правилам шага f. Ошибка, если выполнение какого-либо отложенного процесса приводит к появлению дельта-цикла сразу после текущего цикла моделирования.
Значения сигнала не меняются во время выполнения процесса. Их обновления ставятся в очередь и применяются на другом этапе выполнения цикла моделирования.
назад к -2008:
- Последовательные утверждения, 10.1 Общие положения
В этом разделе описаны различные формы последовательных операторов. Последовательные операторы используются для определения алгоритмов выполнения подпрограммы или процесса; они выполняются в том порядке, в котором они появляются.
Мы видим, что порядок выполнения последовательного назначения сигналов не относится к порядку обновления сигналов.