首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Verilog执行并行或顺序if块以及另一条语句

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

Stack Overflow用户
提问于 2019-12-27 12:03:14
回答 1查看 1.6K关注 0票数 0

以下是verilog代码

我试着理解始终块中语句的工作原理。我知道使用=编写阻塞语句的规则,在verilog中使用<=编写非阻塞语句,我知道这些语句的工作原理。

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

代码语言:javascript
复制
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语句”被合成成多路复用器。它会使用在前一个statement1?-The输出中更新的值吗?-The输出应该是按顺序执行的三个语句。

但是,当这在硬件中实现时,“if”的mux将与其他adders.So分开,我认为中间的if statement3将与语句1和3并行工作。

我签入了模拟,所获得的值是最新的值--即,它似乎是按顺序工作的。

我的问题是

1.在其他作业之间使用“if语句”是否正确。或者我应该使用另一种programming.Will方法,它在使用阻塞语句时按顺序运行?

2.这种做法在所有情况下都会象顺序一样起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-28 02:34:45

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

代码语言:javascript
复制
  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;

以上内容将适用于任何通用的编程语言。如果是if的话,out1 > 5就会被录取。

混淆在阻塞/非阻塞分配中。Verilog对<=有一个非常特殊的语义,非阻塞赋值.实际上,这只是一个模拟的人工制品。这意味着rhs值将不会分配给lhs内部的这个特定的始终块。在对所有块都进行评估之后,它将在稍后完成。

因此,请考虑以下几点:

代码语言:javascript
复制
  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,但是在计算完所有语句之后,它的值将被赋值给它。直到时钟的下一个位置,if语句才会看到它。

1.在其他作业之间使用“if语句”正确吗?或者我应该使用另一种programming.Will方法,它在使用阻塞语句时按顺序运行?

这取决于你在这里想要达到的目标。可能是正确的也可能不是

sequentially?

  1. 在所有条件下都能工作吗?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59500539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档