Они выполняются параллельно, как вы говорите.Я думаю, что лучшим словом будет одновременно , что оставляет слово параллельный для описания топологии.
Моделирование Verilog управляемое событиями .Событие - это изменение значения переменной или сети (или verilog event
).Когда происходит событие, это приводит к выполнению threads .Который создает больше событий, который вызывает выполнение большего количества потоков и так далее.Это происходит до тех пор, пока больше не будет событий, когда симуляция остановится.(Это называется событие истощения .) Если события продолжают генерироваться вечно, то моделирование никогда не останавливается (если не выполняется оператор $stop
или $finish
.)
Итак,что за нить?Блок initial
, блок always
или оператор assign
- все они выполняются одновременно друг с другом.
Итак, как симулятор узнает, какие потоки выполнять после события?Каждый поток имеет список чувствительности , явный или неявный.Это список сетей, переменных или verilog event
s.Любое событие в любом из них приводит к выполнению потока.Некоторые блоки всегда имеют явные списки чувствительности, например, always @(posedge clock or posedge reset)
;другие имеют неявные списки чувствительности, например, assign
операторов.Оператор assign
чувствителен ко всем сетям или переменным в правой части вашего назначения.
Итак, оператор
assign C[0] = cin;
чувствителен только к cin
.Таким образом, он будет выполняться каждый раз, когда происходит изменение cin
.Когда он выполняется, он может генерировать событие на C[0]
.Этот оператор
assign C[1] = G[0] | (P[0] & C[0]);
чувствителен к C[0]
(и G[0]
и P[0]
), поэтому, если есть событие на C[0]
, оно выполнится, возможно, вызвав изменение на C[1]
и т. д.
Вот так ваш код дает "правильный результат".