Verilog 并行或顺序执行 if 块以及另一条语句

Verilog execution parallel or sequential if block along with another statement

以下为verilog代码
我试图了解 always 块中语句的工作原理。 我知道在 verilog.I 中使用 = 和非阻塞使用 <= 编写阻塞语句的规则知道它们的工作原理。

如果 if 语句(带有阻塞语句)出现在阻塞语句之间会发生什么?

always(@posedge clk)
begin
  if(en1)
  begin
      out1=c;   //statement 1
      out2=c+1; //statement 2
      if(out2>5)
      begin
      out3=out1+out2;//statement 3
      end
      else
      out3=0;
      out4=out1-out2;
  end
end

'if statement' 被合成为多路复用器。它会使用在前面的statement1中更新的值吗???要求是 - 输出应该是三个语句顺序执行。

但是当这在硬件中实现时,“if”的多路复用器将与另一个分开adders.So我认为中间的 if 语句 3 将与语句 1 和 3 并行工作。

我检查了模拟,取的值是最新的值——也就是说,好像它是按顺序工作的。

我的问题是
1.Is 在其他作业之间使用 'if statements' 是正确的。 或者我应该使用另一种方法 programming.Will 它 运行 在使用阻塞语句时顺序?
2.Will 这在所有条件下都按顺序工作吗?

这里的故事很简单。在模拟中,always 块中的所有语句总是按顺序执行,就像在任何编程语言中一样。 if 语句将在赋值后执行,如下面给出的顺序。

  1> out1=c;   //statement 1
  2> out2=c+1; //statement 2
  3> if(out2>5)
       begin
  3a>      out3=out1+out2;//statement 3
     end
     else
  3b>     out3=0;
  4> out4=out1-out2;

以上内容与任何通用编程语言一样有效。如果 out1 > 5.

将被占用 if

混淆在 blocking/non-blocking 作业中。 Verilog 对 <=、非阻塞赋值有非常特殊的语义。其实它只是一个模拟神器。这意味着 rhs 值不会分配给此特定 always 块内的 lhs。稍后会在评估所有 always 块之后完成。

因此,请考虑以下几点:

  out1=c;   //statement 1
  out2 <= c+1; //<<<< non blocking, assignment here, statement 2
  if(out2>5)
       begin

现在,如果c是4而rhs的结果c+1是5,if语句仍然会被执行,因为out2还没有在此块中更新。它仍将具有先前的值 4。但是在所有语句都被评估之后,值 5 将在最后分配给它。它不会被 if 语句看到,直到你的时钟的下一个姿势。

1.Is it correct to use 'if statements' in between other assignments. or should I use another method of programming.Will it run sequentially when blocking statements are used?

这取决于您要在此处实现的目标。正确与否

  1. Will this work in all conditions as if sequentially?

正如我上面所解释的。不过你必须明白一件事。 Verilog 不是 一种硬件描述语言。它是一种用于描述硬件所需 行为 的语言,并由综合工具进行解释。因此,当您的仿真结果与合成原理图的行为不匹配时,您可能 运行 遇到这种情况。为了尽量减少这种可能性,您应该使用业界公认的 verilog 编程实践。其中之一:对边缘控制块的真实输出使用非阻塞赋值。这样做有令人信服的理由。从这个角度来看,你的例子是完全错误的。