Verilog HDL - Вложенный оператор if внутри блока always posedge - PullRequest
0 голосов
/ 10 июля 2020

То, что я собираюсь сделать, показано в приведенном ниже коде -

always @(*) begin
    if (condition_a) begin
        A_next = X;
        if (condition_b) begin
            A_next = Y;
        end
    end else begin
        A_next = 0;
    end
end

always @(posedge clk) begin
    A <= A_next;
end

Вместо того, чтобы делать вышеописанное, если я напишу код, показанный ниже, будет ли он вести себя так же?

always @(posedge clk) begin
    if (condition_a) begin
        A <= X;
        if (condition_b) begin  //This nested if is what I'm not sure will work or not
            A <= Y;
        end
    end else begin
        A <= 0;
    end
end

1 Ответ

0 голосов
/ 10 июля 2020

Все if должны иметь else в блоке always(*).

Итак, вы должны писать свой блок как он:

always @(*) begin
  if (condition_a) begin
    if (condition_b) begin
      A_next = Y;
    end else begin
      A_next = X;
    end
  end else begin
      A_next = 0;
  end
end

Чтобы избежать защелок и комбинационных циклов.

...