Нет, нет условий гонки. Verilog - это симулятор, управляемый событиями. Поседж (если в часах нет сбоя или сброса) обычно выполняется один раз за такт имитации. Если вы используете неблокирующие назначения правильно (и похоже, что вы это сделали), каждый всегда блок, инициируемый ребром, будет использовать старые версии значений входной переменной, значения, которые существовали до фронта тактовой частоты.
Вот упрощенный пример:
always @(posedge clk)
r <= in;
always @(posedge clk)
out <= r;
В этой ситуации происходит следующее:
r
будет присвоено значение in
позже на отметке моделирования, после того, как были оценены всегда блоки (см. область планирования nba).
, поскольку r
еще не было действительно изменено, out
будет назначено значение r
со значением перед ребром.
Если r
было 0 до края, а in
было 1, в конце симуляции r
станет 1 и out
станет 0.
Это имитирует поведение реальных флопов на железе.
В вашем случае это может выглядеть как зависимость oop. На самом деле это не так. По той же причине, что и выше, значение M
будет тем же, что и перед постановкой, и не вызовет гонки. Флопы не могут быть включены в комбинационные циклы из-за их свойств логических свойств.