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