我遇到的情景中,一般后仿真出现不定态的原因有三个:
更多的后仿出现不定态的的情形可以参考以下文章。
1、在测试激励中没有对顶层文件的输入端口赋初值。
可见,良好的测试激励编写习惯很重要,首先应该对顶层输入端口赋初值,否则前仿真没有问题,到了后仿真出现问题,调试极其困难;
2、多重驱动冲突产生不定态
在同一时刻,两个不同的地方对同一个信号进行赋值,会冲突。多重驱动既会发生在DUT的设计中,也会发生在测试激励的编写中。尤其是在测试激励中编写三态inout端口的控制,如果控制信号产生的时机不合理,很容易导致冲突。
3、异步信号在传输过程中,建立世间和保持时间违例,产生不定态后并且向后级模块传播,最终导致不定态输出。
最近遇到了案例,就是接送异步串口的数据后,产生不定态并向后级传播(即使异步输入信号进行两级同步后,不定态仍然会进行传播),导致接收数据错误。
参考这篇文章,在modelsim中vsim阶段,添加 +no_notifier选项解决问题。
当然,这个+no_notifier 不是随便添加的。一定要确认该不定态的产生,是由于异步信号跨时钟域引起的建立、保持时间违例引起的,并且已经确认代码中已经使用跨时钟域处理后,再使用+no_notifier。
跟同事分享这个方法后,他觉得这个有点像静态时序中跨时钟之间设置false路径一样。我觉得说的挺有道理的,可以联系再一起进行记忆。
额外说一下,遇到这个问题是如何进行解决的。
好的搜索解决了问题的一半。
1、再微信搜索中输入关键词,后仿不定态。我一般用微信进行搜索,一般微信搜索可以搜索到很多优秀的公众号文章。
后仿详解 - 用VCS对布局布线后的门级网表进行仿真https://mp.weixin.qq.com/s/iBw1VA01QINIOpZjwQCH7A其中在上述链接中,查找到+no_notifier这个选项,作为关键词进一步的搜索,最终找到解决方案。