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

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

如下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)不成立。和预期一致。

更多相关阅读

IES low-power中的set_sim_control命令
pxp的ixcom模式,memory不能定义太大问题
sv的dvfs的时钟实现

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

发表评论

邮箱地址不会被公开。 必填项已用*标注