时序逻辑用的都是非阻塞赋值“ =”,它与阻塞赋值“=”的区别表现在于:非阻塞赋值的意思是该句表达不会阻塞后续表达的执行,如下例中,X =0的执行,不会阻碍到Y =0的执行,它们是同时发生的。
而阻塞赋值,意思是如果前一句不执行,后一句就无法执行,前一句会阻塞后一句。如下例中C语言的表达就是阻塞赋值, c = a + b 如果不执行, d =3* c 也不执行。
int abc(int a, int b) { int c, d; c = a + b; d = 3 * c; return(d); }
对于可综合的Verilog来讲,其实并不会阻塞。在下例中,always块的目的是创造 z 和 k 两个信号。 k =3* z 和 z = a & b 是两个不同的电路, k =3* z 电路不会被 z = a & b 阻塞。本例对应的原理图如图2—7所示。可见,对于电路描述来讲,语法只是表示一种连接关系,并没有执行先后顺序的说法,但如果本例使用非阻塞赋值,语法检查会报错,因此,这是一种惯用方法。阻塞赋值在Verilog中真正体现阻塞,是在仿真使用的不可综合语法中,到第3章再做解释。
图2—7 本例对应的原理图