阻塞赋值和非阻塞赋值这两种仿真波形的区别
时间: 2024-05-21 21:13:35 浏览: 11
阻塞赋值和非阻塞赋值是Verilog中两种不同的赋值方式,它们在仿真中的行为有所不同。
阻塞赋值(Blocking Assignment):用“=”进行赋值,它会立即将右侧的值赋给左侧变量,并且会等待右侧的语句执行完毕之后再执行下一条语句。
非阻塞赋值(Non-Blocking Assignment):用“<=”进行赋值,它会在一个时间片内完成所有的赋值,然后在下一个时间片开始时,将所有赋值的结果同步到左侧的变量上。
在仿真波形上,阻塞赋值和非阻塞赋值的区别是非常明显的。例如,下面是一个简单的Verilog代码:
```verilog
module test;
reg [1:0] a, b, c;
always @(a, b)
begin
c = a + b;
a <= c;
b <= a;
end
endmodule
```
在这个代码中,a、b、c都是寄存器类型的变量。在always块中,首先使用阻塞赋值将a和b相加的结果赋值给c,然后使用非阻塞赋值将c的值赋给a,将a的值赋给b。这个模块的作用是计算斐波那契数列。
下面是使用ModelSim仿真器得到的波形图:
![blocking-vs-non-blocking](https://img-blog.csdnimg.cn/20210328095710462.png)
从图中可以看出,使用阻塞赋值时,c、a、b的值是依次计算出来的,而使用非阻塞赋值时,c、a、b的值是同时计算出来的。这就是阻塞赋值和非阻塞赋值的区别。
相关问题
描述逻辑、分析阻塞赋值和非阻塞赋值的电路差别、仿真波形差异、并说明原因
逻辑
阻塞赋值和非阻塞赋值是在 Verilog 等硬件描述语言中用于给寄存器或线路赋值的两种方法。在逻辑电路中,阻塞赋值和非阻塞赋值之间的差异在于它们如何处理同时发生的多个赋值。
分析
阻塞赋值是一种顺序赋值,即它按顺序执行语句,并将结果立即写入变量。因此,如果有多个阻塞赋值同时执行,则只有最后一个赋值会生效。这意味着前面的赋值将被覆盖,而且可能会导致意外的结果。
非阻塞赋值是一种并发赋值,即它将所有赋值语句同时计算,并在时钟周期结束时一次性写入变量。因此,如果有多个非阻塞赋值同时执行,则所有赋值都将生效,而且不会相互影响。
阻塞赋值的仿真波形通常会显示出更多的冲突和抖动,因为它们的执行方式是顺序的,而且可能会导致多个赋值之间的竞争条件。非阻塞赋值的仿真波形通常会更加平滑,因为它们的执行方式是并发的,并且不会有竞争条件的问题。
原因
这种差异的原因在于它们如何处理赋值语句的顺序和时序。阻塞赋值的执行方式类似于一组命令,需要按照特定的顺序依次执行,而非阻塞赋值的执行方式类似于一组事件,可以同时发生而不会相互影响。因此,非阻塞赋值通常更适合用于处理时序和并发性较高的电路。
阻塞赋值和非阻塞赋值的区别
在硬件设计中,阻塞赋值(Blocking Assignment)和非阻塞赋值(Non-Blocking Assignment)是两种不同的信号赋值方式。
阻塞赋值是在过程执行期间,将右侧的表达式计算出来,并且阻塞等待左侧的信号更新完成后,再将计算结果赋值给左侧的信号。这意味着,只有当阻塞赋值完成后,才能执行下一条语句。比如:
```
always@(posedge clk) begin
a = b;
c = a;
end
```
在这个例子中,当时钟上升沿到来时,a会被阻塞赋值为b,直到a被赋值完成后,才会执行下一行的语句,将a的值赋值给c。
非阻塞赋值是在过程执行期间,将右侧的表达式计算出来,并且将计算结果立即赋值给左侧的信号,不会等待左侧的信号更新完成。这意味着,不会阻塞后续的语句执行。比如:
```
always@(posedge clk) begin
a <= b;
c <= a;
end
```
在这个例子中,当时钟上升沿到来时,a会被非阻塞赋值为b,不会等待a被赋值完成,而是立即执行下一行语句,将a的值赋值给c。
总的来说,阻塞赋值和非阻塞赋值的区别在于,阻塞赋值会等待信号被赋值完成后才会执行下一条语句,而非阻塞赋值不会等待信号被赋值完成。在硬件设计中,这两种赋值方式的选择取决于具体的设计需求和信号之间的依赖关系。