本文主要分析总结芯片验证过程中遇到的仿真器挂死(就是通常所说的hang)的情形。给出的解决方案都是基于Cadence的仿真工具incisive(当然利用xcelium也是没有问题的)和debug工具simvision(当然利用更强大的indago也是没问题的),需要指出来的一点是如果利用xcelium和indago联合调试,需要注意版本兼容问题,利用simvision来debug就不存在这个问题,因为simvision是位于incisive或xcelium的安装目录下的,并不需要单独的license。由于这类问题比较普遍,而且scenario也比较复杂,所以我打算把它做成一个系列。今天是开篇,先列出所有的场景和类型,后续有对应的具体的解决方案。
一、仿真器卡在无限循环或者hang住的场景有很多,原因也各不相同。但大致可以分为如下几类:
1.1:rtl/netlist(网表)无限循环;
1.1.1 signal 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.3 zero-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.4 for循环的最大值不确定导致的无限循环
类似这种:for(int i=0; i!=var;i++) //如果var是X的话for循环就会进入死循环(循环终止条件不确定)
1.5 low power仿真中的hang(仿真挂起);
这也可以展开成一个专题了,在这里就不展开了。
二、上面说的如此抽象,有装逼的嫌疑,那到底该如何实现呢?别急后续结合具体的小例子慢慢展开,保证有图有真相,敬请期待……