| 
 | 
首先讲讲自己对连续赋值和过程赋值的理解。 
 
举个例子 
 
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语句使用“=”阻塞赋值。 |   
 
 
 
 |