#最近在逻辑分析仪抓取的波形图中对于含有非阻塞赋值的判断语句中经常犯迷糊,根据网友的测试代码来帮助理解,特此记录
非阻塞赋值(<=)
一条非阻塞赋值语句的执行是不会阻塞下一条语句的执行,也就是说在本条非阻塞赋值语句执行完毕前,下一条语句也可开始执行。非阻塞赋值语句在过程块结束时才完成赋值操作。在一个过程块内的多个非阻塞赋值语句是并行执行的。
简言之,在同一个always过程块中,非阻塞赋值语句都是同时并发执行的,并且在过程块结束时才执行赋值操作。也就是说,在同一个always过程块中,非阻塞赋值语句被执行没有先后顺序,在过程块结束时,大家一起被赋值
- 块结束后才完成赋值操作。
- b的值并不是立刻就改变的。
- 这是一种比较常用的赋值方法。(特别在编写可综合模块时)
- 在串行语句块中,执行没有先后之分,各条语句并行执行。
非阻塞赋值(<=):非阻塞赋值操作实质上是分两步完成的。
第一步:在敏感事件开始时刻(如clk正跳变沿开始时刻)开始计算等号右边变量(或表达式)的值RHS;
第二步:在敏感事件结束时刻(如clk正跳变沿结束时刻)将等号右边的值赋给等号左边的变量LHS。其中非阻塞的含义为在执行当前的非阻塞赋值语句的同时允许其他的语句执行。
过程块1:
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
a <= 32'd0;
b <= 32'd0;
end
else begin
a <= a + 1;
b <= a;
end
end
过程块2:
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
c <= 32'd0;
else if (a >= 5)
c <= c + 1;
end
仿真图:
解析:
1、过程块1的作用是在上升沿来临之时,a自增1同时b取a的值,过程块2的作用是在上升沿来临之时,如果a≥5则c自增1
2、过程块1分析:在复位拉高之后,第一个上升沿来临之时(一瞬间),同时并发执行
a <= a + 1; //执行时,1将要给a,但要等过程块1执行完,1才会给a
b <= a; //执行时,a将要给b,但此时过程块1未执行完,1并没有给a,a还是0,所以a只能给b的是0,等过程块1执行完,0会给b
一瞬间之后,过程块1执行完毕,开始同时赋值,1给了a,0给了b
通俗讲,就是本次执行的时候大家都藏着掖着,互相只知道上次执行完每个人的值,等本次执行完的时候,每个人才会向外界公开执行时藏着掖着的值,理论上讲,就是两个式子同时赋值,a=1和b=a并行执行,在b=a的时刻a还是0
3、过程块2分析:在第1个红框中的上升沿来临一瞬间,判断a≥5,在这一瞬间代码块1还未执行完即未赋值,此时外界只知道a=4,所以不符合条件
在第2个红框中的上升沿来临一瞬间,a已经向外界公开了自己是5,所以开始进入判断语句,执行c=c+1,一瞬间之后,过程块2执行完毕,c向外界公开自己是1