一、 reg VS wire
assign语句的赋值目标一定是wire型;而过程赋值语句(initial语句和always语句)中赋值目标为reg型。
//Verilog有两大数据类型
一、线网类型:表示结构化元件间的物理连接,它的值由驱动元件的值决定,eg.连续赋值或门的输出,如果没有驱动元件连接到线网,则缺省值为z(高阻)线网子类型如下:
- wire
- tri
- wor
- trior
- wand
- triand
- trireg
- tri1
- tri0
10.supply0
11.suppply1
二、寄存器类型:表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来,寄存器的变量缺省值为x(未知),五种寄存器类型如下:
- reg
- integer
- time
- real
- realtime
//
二、 阻塞赋值 VS 非阻塞赋值
在Verilog中有三种赋值语句
1、连续性赋值:assign x=y,当不在一个过程块中时使用(eg.always块)
2、过程性阻塞赋值:x=y,在过程块内使用,赋值完成后,才进行下一条语句的执行,赋值一旦完成,被赋值变量的值立即变化(串行,立即生效)
3、过程性非阻塞赋值:x<=y,在过程块内使用,允许块内的其他语句同时执行,且在一个仿真周期结束时才更新被赋值的变量,非立即生效。
所以在一个过程块中,非阻塞赋值的表达式书写的顺序不影响赋值结果,而阻塞赋值则会出现不同顺序的表达式赋值结果不一样。
举例说明:
设初始值x=0,y=0,且a=1;
always@()
begin
x=a;
y=x;
end
阻塞赋值,最后输出的结果为y的值为x变化后的值,即结果为x=1,y=1;
always@()
begin
x<=a;
y<=x;
end
非阻塞赋值,最后输出结果为y的值为x的旧值,结果为x=1,y=0。