Verilog HDL语言中关于赋值的一些概念
赋值有四种方法:门基元,持续(连续)赋值,过程阻塞赋值(“=”)和非阻塞赋值(“<=“)。这四种方法分成两大类:门级时序模型和过程时序模型。
门级时序模型:
门基元:and(a,b,c);
又可写成:assign a = b&c;
这两个语句是等价的,两者都是执行b和c的按位与运算,并将结果赋给a。无论什么时候,只要任何一个输入(b或c)发生变化,都要重新计算输出a的值。此外,a是个线网。
过程时序模型:
过程时序模型使用initial和always块中的过程语句来产生新值。注意initial和always块中的语句是顺序执行的。
always块:
[email protected](posedge clock)
Q <= D;
两个输入(clock和D)一个输出Q。与门级时序相对应,过程赋值对它的所有输入不敏感;只在特定的时刻对特定的输入敏感。这里,always只对时钟上升沿的变化敏感,当时钟上升沿出现的时候,Q被D的值更新。但是,如果always块的输入端另一个输入D改变了,Q的值并不更新。过程模型支队它们显示等待的输入敏感,此外,所有过程赋值语句的左侧都是寄存器。
过程阻塞赋值(“=”)立即更新它左边的值,所以新值可以使用在下一条过程语句中。相反,过程非阻塞赋值(“<=”)只有当整个设计中等待同一边沿的所有”<=”语句都计算完毕后才更新它左边的值,可以形象地说新值别想在这次边沿有效时使用。比如:
@(posedge clock)
m = 3;
n = 75;
n <= m;
r = n;
请问本次边沿有效后什么值赋给了r呢?答案是75,虽然第三条语句把n的值改为3,但是本次边沿别想用这个新值,但“=”的赋的新值立即可用。
本质(这个本质就是电路实现)上讲,这两种时序模型与Verilog语言的两种基本数据类型(线网和寄存器)有密切连续,持续赋值和基元们只能驱动线网,而过程赋值只能用于寄存器。
描述组合逻辑的always块里面用阻塞式赋值 “=”;
描述时序逻辑的always块里面用非阻塞赋值 “<=”