Допустим, у нас есть эти два if
условия, присваивающие значения одной и той же переменной, и оба if
утверждения могут быть истинными одновременно. Какое значение будет иметь х? Допустим, z и y равны 0.
Из моего тестирования в симуляторе оператор if
, который был написан ниже в коде, имел приоритет. Значение x было равно 1, когда я смоделировал приведенный ниже код со значениями z и y, равными 0. Когда я поменял местами условия if
(в конце появилось условие if
с «!z»), значение x пришло равным 0 в моделировании.
Есть ли правило, когда такое состояние возникает в Verilog?
always @ (posedge clk) begin
x <= 1'b0;
if (!z) begin
x <= 0;
end
if (!y) begin
x <= 1;
end
end
Правила для всего поведения Verilog установлены в IEEE Std 1800-2017. В разделе 9.3.1 «Последовательные блоки» говорится:
A sequential block shall have the following characteristics:
— Statements shall be executed in sequence, one after another.
В этом контексте последовательный блок определяется ключевыми словами begin/end
.
Кроме того, раздел 10.4.2 Неблокирующие процедурные назначения:
Порядок выполнения отдельных неблокирующих назначений данная переменная должна быть сохранена.
Однако гораздо чаще код пишут так, чтобы каждое неблокирующее присваивание было однозначным.
always @ (posedge clk) begin
if (!y) begin
x <= 1;
end else if (!z) begin
x <= 0;
end else begin
x <= 0;
end
end
При моделировании этого кода будет выполнено только одно из трех назначений.