芯片验证过程中遇到的仿真器挂死的情形

描述

本文主要分析总结芯片验证过程中遇到的仿真器挂死(就是通常所说的hang)的情形。给出的解决方案都是基于Cadence的仿真工具incisive(当然利用xcelium也是没有问题的)和debug工具simvision(当然利用更强大的indago也是没问题的),需要指出来的一点是如果利用xcelium和indago联合调试,需要注意版本兼容问题,利用simvision来debug就不存在这个问题,因为simvision是位于incisive或xcelium的安装目录下的,并不需要单独的license。由于这类问题比较普遍,而且scenario也比较复杂,所以我打算把它做成一个系列。今天是开篇,先列出所有的场景和类型,后续有对应的具体的解决方案。

一、仿真器卡在无限循环或者hang住的场景有很多,原因也各不相同。但大致可以分为如下几类:

1.1:rtl/netlist(网表)无限循环;

1.1.1signal glitches(信号毛刺)

使用irun/xrun的-delay_trigger这个option可以过滤掉毛刺,能够使得仿真进行下去。

1.1.2无限deltacycles

当仿真时间不能往前推进,但是delta cycle无限增加的情形下。可以在仿真开始时,使用如下tcl命令,可以使得delta cycle增加到一定数量后,让仿真自动停下来(注意这时候仿真并未中断,这时候可以继续操作仿真器)。它跟gateloopwarn这个option有点类似。

stop -delta 5000 -timestep -delbreak 1

一旦仿真停下来,我们就可以使用以下tcl命令debug该循环了:

>run -step//单步调试,注意这有一个前提就是要确保-linedebug这个option是事先打开的

>drivers -active //对应跨越verilog和VHDL边界的网络就该使用drivers -effective命令

1.1.3zero-delay gate level无限循环

如果是gate level的仿真,注意要用-gateloopwarn这个option,其他参考1.1.2的做法

1.1.4错误的使用timescale/time-precision

可以使用

>xrun -timescale 1ns/1ps -override_timescale//在elaborate阶段使用即可

1.1.5设计中有组合逻辑环

可以使用toggle coverage来检测是否有组合逻辑环。当然也可以用HAL, 还可以用profiler,甚至还可以用高大上的JasperGold,工具如此之多,是不是有点懵逼,哈哈

1.2与仿真器(incisive)接口的C/C++代码内部的无限循环,比如PLI/VPI/DPI等;

这个足够展开成一个专题了,这里就不展开了。

1.3仿真环境中的复杂随机约束导致的仿真器挂死(hang)

简单来讲就是启用仿真器的心跳功能,

如果使用命令行启用是这样的

>xrun -xceligen heartbeat 

如果通过Tcl命令启用是这样的:

xcelium>xceligen -heartbeat

如果通过环境变量启用是这样的

Setenv XCELIGEN_HEARTBEAT=[value]

BTW,如果想看求解器是如何迭代或被stuck的,可以使用-utrace这个选项。

1.4for循环的最大值不确定导致的无限循环

类似这种:for(int i=0; i!=var;i++)  //如果var是X的话for循环就会进入死循环(循环终止条件不确定)

1.5low power仿真中的hang(仿真挂起);

这也可以展开成一个专题了,在这里就不展开了。

二、上面说的如此抽象,有装逼的嫌疑,那到底该如何实现呢?别急后续结合具体的小例子慢慢展开,保证有图有真相,敬请期待……

审核编辑 :李倩  

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分