下午验证时间模块time_value时深刻体会到了if else 语句是有优先级的。
(1)正确的情况
正确现象
count在count_start为1的时候,每来一个时钟就自动加1,加到20的时候就清零从头开始加,ma_r则在count值为20的时候加1.
正确代码

在这里插入代码片always@(posedge clk or negedge rst_n)
if(!rst_n)
	begin count<=0;end
else if((count_start==1)&&(count==8'd20))
        begin
        count<=0;
        end
else if(count_start)
	count<=count+1;
else begin count<=count;end

仿真结果

大家可以看看下面的错误代码并对

(2)错误情况
错误代码

错误现象:只在第一个count==20时,ma_r加1了,后面的count加到20也不清零,一直执行count+1的功能,因此ma_r就自动加1加了一次。
错误的仿真结果


原因分析:
if else语句有优先级,错误现象的时候优先执行count+1,所以count+1的功能是正常的,但是count=20的时候count<mark>0,ma_r+1的优先级低于count+1,所以就产生错误了。
(3)问同学
感觉自己理解不透彻,问了问同学,同学说因为
else if(count_start) count<=count+1;(1)
和else if((count_start</mark>1)&&(count<mark>8’d20)) count<=0;(2)
(1) 的条件包含了(2),所以错误发生。
于是我把(2)变成了else if(count</mark>8’d20) count<=0;
但是依然是错误的。
最终分析:我猜想是因为一个时钟上升沿到来的时候,count=19的时候执行+1变为20的时候,还没等低优先执行count清零,下一个时钟上升沿又来啦,所以高优先先执行count+1,于是count=20只有一次,其余都是一次累加,因此ma_r只执行一次+1.

本人新手一枚,希望大家看到错误能提出来,本人万分感谢。因为这个代码是教研室的一个项目中涉及到的,就不贴出来了。