非阻塞赋值的意思就是每条赋值语句的结果直到always块的结尾才能确定。
例如
阻塞赋值:
always@(posedge clk) begin
Q1=1'd1;
Q2=Q1;
end
其等效为Q2=Q1=1。从实现的角度来看,它是由两个D触发器并联的结构而非级联。当第一个 always结束时,Q2和Q1将同样为1。
而非阻塞赋值
always@(posedge clk) begin
Q1<=1'd1;
Q2<=Q1;
end
等效为Q1=1,Q2=Q1。从实现的角度来看,它是两个触发器级联的结构。假设Q1的初值为S0,那么当第一个always结束时,Q1=1,而Q2将等于S0而非1,因为非阻塞赋值在always结尾才会修改Q1的值。也就是说在always执行期间,Q1将一直保持S0,Q1<=1'd1这条语句是暂时没有生效的。