在实际工作中,经常会遇到这样的情况:在硬件调试中采用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. atitit.人脸识别的应用场景and使用最佳实践 java .net php

    atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景1 2. 标准化的api1 3. 框架选型 JNI2OpenCV.dll and JavaCV ...

  2. spark-streaming的checkpoint机制源码分析

    转发请注明原创地址 http://www.cnblogs.com/dongxiao-yang/p/7994357.html spark-streaming定时对 DStreamGraph 和 JobS ...

  3. int和Integer差别

    种原始数据类型之中的一个. Java为每一个原始类型提供了封装类.Integer是java为int提供的封装类. 原始数据类型包含byte.int.char.long.float.double.boo ...

  4. ROW_NUMBER() OVER (PARTITION BY M ORDER BY N DESC 好用

    做查询的时候,发现一个问题,连接之后,有一个表里面有重复的数据.导致另一个表的记录,跟着重复了几遍.用户曾经反馈,评论会多出来几条, 一直没找到原因.只到发现这个问题.才发现了原因.因为一直用sql ...

  5. Python运行机制(转)

    From:https://blog.csdn.net/jeff_liu_sky_/article/details/52097060 https://stackoverflow.com/question ...

  6. linux tableau server 连接 presto

    记录一下这个弄个好久的难题 linux tableau server 版本  tableau-server-2018-2-0.x86_64.rpm 安装过程 我参照了这儿仁兄   http://ju. ...

  7. unity3d面试题与参考答案

    1.C#程序题 1 2 3 4 5 6 7 8 9 10 11 private static void aaa(int x) { x = 10; }   private static void bbb ...

  8. ssl 生成证书

    使用OpenSSL生成证书 1.生成RSA密钥的方法 openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加 ...

  9. CMake error:System Error:No such file or directory CMake error:Could not open file for write in copy operation xxxx.ros_Config.cmake.tmp.

    微型电脑或嵌入式与电脑还是有点不同的,在微型电脑上ros indigo 版本下利用catkin编译如果你遇到如下错误: CMake error:System Error:No such file or ...

  10. iOS 。开发之指纹识别功能

    // 头文件导入 #import <LocalAuthentication/LocalAuthentication.h> //在iPhone5s的时候,苹果推出了指纹解锁.但是在ios8. ...