weiqi7777

irun仿真,竞争产生毛刺,使wait条件满足

0
阅读(120) 评论(0)

在仿真中,出现了以下奇怪的问题。

如下Tb代码,uart_send_one_data任务,发送一个数据后,要等待finish为高后,才可以发送下一个数据。

但是在实际仿真过程中,发现finish信号,并没有变高,wait语句条件就成立了,然后退出该task。又重新发送了一个数据。

波形如下:

finish逻辑代码如下:

通过各种调试手段,包括单步调试,都没有找到原因。最后通过看finish信号生成的代码,发现了问题所在。

究其研究,是因为finish信号的生成,是一个组合逻辑。依赖于state状态和time_arr信号。

当state状态为stop_state状态,finish信号由time_arr决定,而在红线框这个位置,time_arr信号从高变成低。因此finish信号就有从低变高,然后从高变为低,只是这个过程太短暂,出现了上冲毛刺,因此在fsdb波形中,没有体现出来。

但是仿真工具却采集到了这个毛刺,认为finish信号,有变为高电平过,因此在tb中,wait(finish)成立,执行之后的代码。从而造成错误。如果把wait,换成@(posedge)和@(negedge),也是一样的效果。

修改DUT代码,将finish输出,通过寄存器打一拍输出。上述问题消失。

从上图波形看出,修改代码后,没有毛刺信号,因为wait(finish)不成立。和预期一致。