EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2009/8/10 17:34:56

3

标签: SignalTap  Modelsim  

从SignalTap II中获取“最真实”的仿真测试向量

    在实际工作中,经常会遇到这样的情况:在硬件调试中采用SignalTap II反复多次编译并最终捕获到问题的原因时,才会发现,原来这个问题是逻辑问题,是可以在仿真环境下发现并快速解决的。先前没能从仿真中发现这个问题,要么是因为尚未或难以创建对应的测试向量,要么是因为仿真环境下的测试向量与真实环境下的测试条件存在微小的差异。对于设计工程师来说,由于缺乏相应的技术能力、开发时间,甚至是耐心,我们不可能像验证工程师那样对设计进行全面的仿真验证;即使仿真验证很充分,在实际应用中的测试也会发现仿真验证未曾发现的问题。总之,在FPGA设计上板测试后,总会发现或多或少的逻辑bug,,这些bug对应的仿真向量在已有的仿真验证环境中往往都被遗漏了。 riple
    那么,有没有一种亡羊补牢的方法可以让我们在硬件调试中发现逻辑bug后,“快速准确”地创建遗漏的测试向量,并且在仿真环境下重现和解决bug呢?由于仿真环境可以给我们提供对RTL设计最佳的可控制性和可观测性,在仿真环境中定位bug,会比通过SignalTap II多次修改信号列表和编译节省许多时间,解bug也就不会那么耗时和痛苦。通过最近一段时间的思考和今天的尝试,我找到了这一方法! riple

    让我们一起来看看这种方法:
1. 在硬件测试中稳定重现bug。
2. 通过代码分析,初步确定bug产生的模块。
3. 通过SignaTap II,捕获产生bug模块的输入输出。
4. 通过分析该模块的输入输出,确认bug在流经该模块后产生。
5. 把SignalTap II中捕获到的所有输入信号波形转化为HDL测试平台中的测试向量。
6. 针对该模块和上一步得到的测试平台运行单元仿真测试,在仿真测试中观察该模块输出,确认bug在仿真环境下重现。
7. 采用该仿真环境查找并定位bug产生的原因。
8. 采用该仿真环境确认对bug的修改是正确和可靠的。
9. 重新编译并测试修改后的FPGA设计。

    上述各个步骤,除了5、6之外,都可以与仅采用SignalTap II的硬件调试过程中的步骤对应起来。在步骤5中,快速、准确是这种方法的关键。如果把波形转化为测试向量的过程耗时、易错,那么通过步骤7获得的优势就失去了。 riple
    在步骤5中,我采用了SignalTap II的信号波形输出功能,把波形转化为对应的信号取值列表,输出为文本文件;通过文本文件,原本复杂多变的波形文件就可以被其它程序读取并准确地转化为HDL文件,这里我采用的编程语言是Tcl。 riple
    采用这一方法,我花费了4个小时完成了Tcl脚本程序,在1个小时的时间内就定位并解决了不久前PV测试出现的一个问题。如果在现有的仿真环境中手工添加该测试向量,可能会花费比写Tcl脚本更少的时间,但是不能保证重现该问题,调试和反复修改测试用例是潜在的工作量;如果在SignalTap II中调试该问题,由于需要多次编译,大概要花费相当的时间,但是Tcl脚本只需要写一遍就可以重用,这一时间成本是可以摊薄到以后的各次调试中去的。 riple

    SignalTap II捕获硬件信号波形的原理是基于周期采样,波形中每一个数据样点对应于一个时钟周期。所以,在生成测试向量时,必须产生对应于SignalTap II采样时钟的时钟波形,用来规范测试向量的时序。这里,可以采用VHDL的wait until (clk='1'); 语句,或者Verilog的@(posedge clk); 语句产生相应的定时等待,使每一个采样点对应的激励波形按照采样时钟顺序变化。这一处理,可以在本文所附的示例程序中找到。


    附图:

点击看大图
SignalTap II中波形输出为列表的功能

点击看大图
在Modelsim中运行生成测试向量的Tcl脚本

点击看大图
Modelsim中对特定模块生成testbench的工具

点击看大图
Modelsim中采用SignalTap II捕获的测试向量进行RTL级单元仿真的结果

程序示例:zip

相关链接:
FPGA设计开发中应用仿真技术解决故障的方法(图) 这篇文章启发我找到了这一调试方法,向原文的两位作者致谢。本篇博客文章提出了原文思路的另外一种实现方法。

Automating the FPGA Design Debug Process: When Full Visibility is Needed
This comprehensive approach cuts greatly into the time it takes to pinpoint the cause of the particularly vexing bugs caused by intermittencies. It takes advantage of FPGAs' speed for most of the debugging effort and transfers the task to a simulator when full, detailed analysis is required. In essence, TotalRecall technology can be thought of as a "fast-forward button" for simulators.

系统分类: CPLD/FPGA   |   用户分类: Signal Tap II   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

该用户于2010/1/20 13:22:28编辑过该文章

阅读(1648)  |  评论(18)  |  收藏(6)  |  举报  

投一票您将和博主都有获奖机会!

最新评论

  • riple

    2009/12/21 11:48:51

    谢谢ygfeagle朋友的关注。请注意第二幅附图应用示例中的第一行,do stp2hdl.tcl是命令,其余的就是从Modelsim命令行传递给tcl脚本的三个参数$1 $2 $3。stp1_auto_signaltap_found.txt对应第一个参数,0和7这两个参数对应stp1_auto_signaltap_found.txt文件中信号列表的索引。替换这些参数,就可以适用于其他的应用环境。我更新了附带的程序示例,添加了stp1_auto_signaltap_found.txt文件。

  • ygfeagle

    2009/12/20 16:06:51

    这个文章实用性很强, 以前一个老同事用C++写了相似的东西,今天看到riple也遇到同样的问题,但是我不太懂TCL看了一会,后面的还理解的 但是 set stpFileName $1 set stpSigRange [list $2 $3] 这两句话不太懂,$1代表什么呢$2 $3又是? 谢谢riple了

  • riple

    2009/9/30 19:43:38

    不用谢。得知大家有所收获,这是最让我高兴的事了!

  • xiaocat85

    2009/9/28 23:19:42

    受到启发,迅速找到了项目中的BUG,感谢

  • ffggg

    2009/9/13 7:00:06

    高,可惜不熟悉tcl!

  • riple

    2009/9/8 8:42:25

    这确实是个问题。对于存在时序逻辑的模块,光捕获外部输入,不捕获内部状态还是不够的。谢谢你指出这一点,我会考虑解决方案的。

  • wind330

    2009/9/7 9:56:13

    riple兄:我有一个疑问:当你的模块存在状态机或者计数器时,它们的状态是无法通过短期的输入向量决定的,在这种情况下是否有好的解决办法呢?

  • coyoo

    2009/8/13 14:01:57

    那我就先啃下tcl,AZA

  • riple

    2009/8/12 9:02:23

    http://group.ednchina.com/2220/

  • riple

    2009/8/12 9:02:06

    受特权同学的启发,我建立了Modelsim小组,恳请大家加入,共同讨论、进步。

  • riple

    2009/8/12 8:30:26

    Modelsim确实是功能强大,我们一起把它攻克下来吧。

  • ilove314

    2009/8/11 18:32:10

    目前正准备狂啃ModelSim这块硬骨头,把它的强大功能都发掘出来,呵呵,希望今后riple兄多指点

  • riple

    2009/8/11 15:51:57

    大家有机会学习一下Tcl吧,挺有用,也挺好用的!

  • coyoo

    2009/8/11 14:06:50

    高,可惜不熟悉tcl!

  • jackboard

    2009/8/11 13:44:41

    写的不错,又学习了一些东西。但是不太懂的地方是Tcl。。。。。

  • riple

    2009/8/11 9:28:25

    用Quartus仿真,还是比用SignalTap II调试来得快些。

  • riple

    2009/8/11 9:26:35

    你好,你的方法是可行的!只不过Quartus仿真的对象是门级网表,不是RTL代码,可观察性差了些。

  • 24272809

    2009/8/10 23:11:12

    博主,我想问一下,如果把signalTAP中的对应模块的输入信号Export成quartus的vwf文件,是不是也可以在quartus中进行仿真,也可以实现你所说的在仿真环境下重现bug?