以下是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语句”被合成成多路复用器。它会使用在前一个statement1?-The输出中更新的值吗?-The输出应该是按顺序执行的三个语句。
但是,当这在硬件中实现时,“if”的mux将与其他adders.So分开,我认为中间的if statement3将与语句1和3并行工作。
我签入了模拟,所获得的值是最新的值--即,它似乎是按顺序工作的。
我的问题是
1.在其他作业之间使用“if语句”是否正确。或者我应该使用另一种programming.Will方法,它在使用阻塞语句时按顺序运行?
2.这种做法在所有情况下都会象顺序一样起作用吗?
发布于 2019-12-28 02:34:45
这里的故事很简单。在模拟中,始终块中的所有语句总是按顺序执行,就像在任何编程语言中一样。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;以上内容将适用于任何通用的编程语言。如果是if的话,out1 > 5就会被录取。
混淆在阻塞/非阻塞分配中。Verilog对<=有一个非常特殊的语义,非阻塞赋值.实际上,这只是一个模拟的人工制品。这意味着rhs值将不会分配给lhs内部的这个特定的始终块。在对所有块都进行评估之后,它将在稍后完成。
因此,请考虑以下几点:
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?
正如我前面所解释的。但你必须明白一件事。Verilog是,而不是,是一种硬件描述语言。它是一种描述硬件期望行为的语言,并由综合工具进行解释。因此,您可能会遇到一种情况,您的仿真结果将不匹配的行为合成的原理图。为了尽量减少这种可能性,您应该使用业界接受的verilog编程实践。其中之一:使用非阻塞分配的实际输出的边缘控制块。这样做有令人信服的理由。从这个角度来看,你的例子完全错误。
https://stackoverflow.com/questions/59500539
复制相似问题