【问题标题】:Verilog execution parallel or sequential if block along with another statementVerilog 并行或顺序执行 if 块连同另一个语句
【发布时间】:2019-12-27 12:03:14
【问题描述】:

以下是verilog代码
我正在尝试了解始终块内语句的工作方式。 我知道在verilog中使用=和非阻塞使用

如果 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 语句”被合成到多路复用器中。是否会使用上一条语句中更新的值1 ???要求是 - 输出应该是三个语句顺序执行的。

但是当这在硬件中实现时,'if' 的多路复用器将与其他加法器分开。所以我认为中间的 if 语句 3 将与语句 1 和 3 并行工作。

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

我的问题是
1.在其他作业之间使用“if statements”是否正确。 还是我应该使用另一种编程方法。使用阻塞语句时它会顺序运行吗?
2.这是否会在所有条件下都按顺序工作?

【问题讨论】:

标签: verilog fpga hdl sequential


【解决方案1】:

这里的故事很简单。在模拟中,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

混淆在于阻塞/非阻塞分配。 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.在其他赋值之间使用'if statements'是否正确。还是我应该使用另一种编程方法。使用阻塞语句时它会顺序运行吗?

这取决于您在这里想要实现的目标。可能正确与否

  1. 这是否会在所有条件下都按顺序工作?

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

【讨论】:

  • 感谢您的详细解释。现在我有了更好的主意。 Out3 和 out4 不是最终输出。它们代表了一些决定最终输出的动作。
  • 如果它是一个while循环或带有完整阻塞分配的for循环而不是if语句,这是否同样有效?
  • 是的,它会遵循相同的规则。但是,当您编写可综合循环时,迭代次数必须在编译时可计算,并且您应该使用阻塞赋值来更新循环计数器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多