if else 语句是有优先级的

本文介绍了在Verilog编程中遇到的ifelse语句优先级问题,通过错误和正确代码的对比,分析了当count达到20时,为何ma_r的加1操作未能正确执行。作者提出,问题可能在于时钟上升沿的同步问题,导致count清零操作未能在下一个时钟上升沿前完成。新手开发者分享了其对这一问题的理解和尝试解决的过程,希望能得到更多专业人士的指导。
摘要由CSDN通过智能技术生成

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IC媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值