|
首先讲讲自己对连续赋值和过程赋值的理解。
举个例子
module Procedual;
reg A,B,Z;
always@(B)
begin
Z = A;
A = B;
end
endmodule
module Continuous;
wire A,B,Z;
assign Z = A;
assign A = B;
endmodule
如果在某一时刻B的值发生了改变,那么左边的赋值模块中两个赋值语句Z=A;A=B;讲依次执行,(这是阻塞式赋值,后面分析非阻塞式赋值“<=”两者的区别)。A在这一时刻将被赋为B的新值,而Z没有得到B的值,因为这句是在A=B;之前执行。如果A发生变化的话,这个赋值模块将不会被执行,因为A不是在always的敏感信号列表里面。
同样的情况在右边的语句中由于B发生变化,引发了assign A=B;的执行,这样继而引发assign Z=A;的执行,这样两个语句都将执行。如果A发生变化,同样会使这两个语句执行。
总结一下:
过程赋值 连续赋值
在always语句或者initial语句内出现
执行与周围其他语句有关
驱动寄存器变量(reg)
使用“=”或者“<=”赋值符号
在一个模块内出现
与其他语句并行执行
在右端操作数的值发生变化的时候执行
驱动线网变量(wire)
有assign关键字
阻塞和非阻塞
1:阻塞赋值“=”
阻塞赋值语句是在这句之后所有语句执行之前执行的,也就是这句没有执行的话后面的语句就无法执行,这也是“阻塞”的意思。可以理解为为顺序执行。
2:非阻塞赋值“<=”
非阻塞赋值语句是和后面的相关语句同时执行,可以理解为并行执行。
说明:
(1).时序电路建模时候,使用非阻塞赋值
(2).组合逻辑建模时候,使用阻塞赋值
一般assign语句使用“=”阻塞赋值。 |
|