阻塞赋值和非阻塞赋值这两种仿真波形的区别
时间: 2024-05-21 16:13:35 浏览: 144
Verilog阻塞与非阻塞赋值的区别
阻塞赋值和非阻塞赋值是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的值是同时计算出来的。这就是阻塞赋值和非阻塞赋值的区别。
阅读全文