在实际工作中,经常会遇到这样的情况:在硬件调试中采用SignalTap II反复多次编译并最终捕获到问题的原因时,才会发现,原来这个问题是逻辑问题,是可以在仿真环境下发现并快速解决的。先前没能从仿真中发现这个问题,要么是因为尚未或难以创建对应的测试向量,要么是因为仿真环境下的测试向量与真实环境下的测试条件存在微小的差异。对于设计工程师来说,由于缺乏相应的技术能力、开发时间,甚至是耐心,我们不可能像验证工程师那样对设计进行全面的仿真验证;即使仿真验证很充分,在实际应用中的测试也会发现仿真验证未曾发现的问题。总之,在FPGA设计上板测试后,总会发现或多或少的逻辑bug,,这些bug对应的仿真向量在已有的仿真验证环境中往往都被遗漏了。

     那么,有没有一种亡羊补牢的方法可以让我们在硬件调试中发现逻辑bug后,“快速准确”地创建遗漏的测试向量,并且在仿真环境下重现和解决bug呢?由于仿真环境可以给我们提供对RTL设计最佳的可控制性和可观测性,在仿真环境中定位bug,会比通过SignalTap II多次修改信号列表和编译节省许多时间,解bug也就不会那么耗时和痛苦。通过最近一段时间的思考和今天的尝试,我找到了这一方法!

让我们一起来看看这种方法:
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获得的优势就失去了。

     在步骤5中,我采用了SignalTap II的信号波形输出功能,把波形转化为对应的信号取值列表,输出为文本文件;通过文本文件,原本复杂多变的波形文件就可以被其它程序读取并准确地转化为HDL文件,这里我采用的编程语言是Tcl。

     采用这一方法,我花费了4个小时完成了Tcl脚本程序,在1个小时的时间内就定位并解决了不久前PV测试出现的一个问题。如果在现有的仿真环境中手工添加该测试向量,可能会花费比写Tcl脚本更少的时间,但是不能保证重现该问题,调试和反复修改测试用例是潜在的工作量;如果在SignalTap II中调试该问题,由于需要多次编译,大概要花费相当的时间,但是Tcl脚本只需要写一遍就可以重用,这一时间成本是可以摊薄到以后的各次调试中去的。

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

附图:

SignalTap II中波形输出为列表的功能

在Modelsim中运行生成测试向量的Tcl脚本

do stp2hdl.tcl是命令,其余的就是从Modelsim命令行传递给tcl脚本的三个参数$1 $2 $3。stp1_auto_signaltap_found.txt对应第一个参数,0和7这两个参数对应stp1_auto_signaltap_found.txt文件中信号列表的索引。替换这些参数,就可以适用于其他的应用环境。

Modelsim中对特定模块生成testbench的工具

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

程序实例下载:http://yunpan.cn/QD9r7Qip7yww8

从SignalTap II中获取“最真实”的仿真测试向量(ZZ)的更多相关文章

  1. Kubernets中获取客户端真实IP总结

    1. 导言 绝大多数业务场景都是需要知道客户端IP的 在k8s中运行的业务项目,如何获取到客户端真实IP? 本文总结了通行的2种方式 要答案的直接看方式一.方式二和总结 SEO 关键字 nginx i ...

  2. Tomcat 8.5中获取客户端真实IP及协议

    获取客户端真实IP ServletRequest接口提供了getRemoteAddr方法用于获取客户端IP,但是当客户端通过代理服务器访问后端服务器的时候,服务器调用getRemoteAddr方法会返 ...

  3. 在richtextbox中获取最真实的字符串像素大小

    设计器: partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.Com ...

  4. SignalTap II逻辑分析仪的使用

    一.例子 我们使用如图1所示的verilog代码所实现的开关电路作为例子.这个电路把DE系列开发板上的前8个开关简单的和对应的8个红色LED相连接.它是这样工作的:在时钟(CLOCK_50)的上升沿读 ...

  5. SignalTap ii的使用

    1.实现原理 SignalTap II获取实时数据的原理是在工程中引入Megafunction中的ELA(Embedded Logic Analyzer),以预先设定的时钟采样实时数据,并存储于FPG ...

  6. 在有nginx做反向代理时候,如何获取用户真实Ip信息

    在获取用户的Ip地址时,不一定可以获取到用户真实的地址信息,这要看代理服务器的类型,代理服务器有普通匿名代理服务器,高匿代理服务器,像这种情况很难获取到用户真实的Ip地址 假如用户没有使用匿名代理服务 ...

  7. 7个获取访问者真实IP的方法,速学!!!

    通常情况下,网站访问并不是简单地从用户的浏览器直达服务器,中间可能部署有CDN.WAF.高防.例如,采用这样的架构:“用户 > CDN/WAF/高防 > 源站服务器” .那么,在经过多层代 ...

  8. nodejs之获取客户端真实的ip地址+动态页面中引用静态路径下的文件及图片等内容

    1.nodejs获取客户端真实的IP地址: 在一般的管理网站中,尝尝会需要将用户的一些操作记录下来,并记住是哪个用户进行操作的,这时需要用户的ip地址,但是往往当这些应用部署在服务器上后,都使用了ng ...

  9. spring中获取当前项目的真实路径

    总结: 方法1: WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext ...

随机推荐

  1. [Oracle] - Install Oracle12cR1 on Oracle Linux 6.5 in VirtualBox

    My Oralce Linux 6.5 is running on VirtualBox. Basic settings is 4G memory, 50G hard-disk, auto parti ...

  2. Python内置函数之exec()

    exec(object[,gobals[,locals]])这个函数和eval()有相同的作用,用来做运算的. 区别是,exec()可以直接将运算结果赋值给变量对象,而eval()只能运算不能赋值. ...

  3. jsdoc — js注释

    官方文档 http://usejsdoc.org/ - sublime插件 https://github.com/spadgos/sublime-jsdocs - 生成文档 生成html: (1)安装 ...

  4. wireshark抓包常见提示含义解析

    原文转自:http://blog.sina.com.cn/s/blog_987e00020102wq60.html http://www.cnblogs.com/redsmith/p/5462547. ...

  5. Android Studio--NDK编译C代码为.so文件,JNI调用

    前言: 从Android Studio开始,就支持jni和.so库调用了. 环境: Windows 7+Android Studio2.1.2+NDK版本:android-ndk-r10e 准备工作: ...

  6. fedora上安装sun jdk

    系统被来就有openjdk,但是开发工具需要sun的jdk,于是下载一个压缩包并解压到一个位置.使用alternative命令切换 alternatives --.0_79/jre/bin/java ...

  7. python 自动化之路 day 19 Django基础[二]

    Django - 路由系统 url.py - 视图函数 views.py - 数据库操作 models.py - 模板引擎渲染 - HttpReponse(字符串) - render(request, ...

  8. ansible使用

    常用ad hoc命令, 如:ansible raleigh -m shell -a 'echo $TERM' ansible webservers -m service -a "name=h ...

  9. 第11章 Docker Registry 相关问题

    11.1 我 docker push 的时候怎么报 authentication required 错误? 因为你没有登录.如果是向 Docker Hub 推送镜像,需要在注册一个用户: https: ...

  10. Convert.ToInt32(string '000000003') 变成了 3

    Convert.ToInt32(string '000000003') 变成了 3 但是在查询的时候需要用的是string 这里的convert.toint32 反而起了坏作用,不是所有的时候都要用c ...