FPGA设计中仿真技术解决故障的方法

2008-07-24 15:06:14编辑:孙树宾 关键字:仿真方法  故障  Quartus  输出模块  bug  FPGA  dat文件  信号波形

  本文针对FPGA实际开发过程中,出现故障后定位困难、反复修改代码编译时间过长、上板后故障解决无法确认的问题,提出了一种采用仿真的方法来定位、解决故障并验证故障解决方案。可以大大的节约开发时间,提高开发效率。

  FPGA近年来在越来越多的领域中应用,很多大通信系统(如通信基站等)都用其做核心数据的处理。但是过长的编译时间,在研发过程中使得解决故障的环节非常令人头痛。本文介绍的就是一种用仿真方法解决故障从而减少研发过程中的编译次数,最终达到准确定位故障、缩短解决故障时间的目的。文例所用到的软件开发平台为Altera公司的Quartus II,仿真工具为ModelSim。

  问题的提出

  系统开发在上板调试过程中,有时候出现的bug是很极端的情况或很少出现的情况,而现在通常的做法是:在故障出现的时候通过SignalTap把信号抓出来查找其问题的所在、修改程序;在改完版本后,先要对整个工程进行重新编译,然后再上板跑版本进行验证,看看故障是否解决。

  这样就会出现三个问题:

  ①有时候故障很难定位,只知道哪个模块出错,很难定位到具体的信号上,给抓信号带来麻烦。如果故障定位不准确,漏抓了关键信号,则需要重新在SignalTap里添加信号、编译版本并再次上板定位故障,浪费时间。

  ②故障定位后,修改代码还需要再编译一次产生新版本的下载文件,修改后若还有问题则要重复这一过程,这样从故障定位到修改完成需要很多次编译。

  ③上板重新进行验证时,如果这个bug的出现的几率很小,短时间内不再复现,并不能说明在极端情况下的故障真的被解决了。

  举例说明:

  

  图1 SignalTap抓出的bug出现时的数据

  

  图2 SignalTap抓信号界面

  例如在一个基带系统的FPGA逻辑版本中,输出模块调用了一个异步FIFO,某一时刻FIFO已空的情况下多读了一个数据,产生了bug,如图1所示。

  该输出模块的功能是判断FIFO中是否有大于4个数据可读出,若大于则连续输出4个数据作为一组。系统中采用异步FIFO的内部读数据指针来做判断,而异步FIFO读写数据需要跨时钟域,需要至少2个时钟周期的握手时间,导致数据指针不准确。在判断的时钟沿,虽然显示有超过4个的数据可读,但是因为握手时间的延迟实际上FIFO中可能只有3个数据。

  图1中rdreq为FIFO的读使能信号,在4个时钟周期内有效,但是只读出了3个数(数据0D2086C9F被读了两次),因为FIFO在第4个时钟周期已经读空。这里应该改成同步FIFO,由于同步FIFO数据的读写只在一个时钟域内进行,就没有这个握手时间延迟的问题了。

  定位这个故障的时候我们可以很容易知道是哪个模块出了问题,但是具体是其内部的哪个信号还需要下些功夫,如果出错信号隐藏的很深,很难一次就抓到需要的信号;而且即使我们抓到了正确的信号,如果故障在改完之后没有解决,则还需要重新修改、再进行编译,耗费时间;即使改过之后故障不再复现,也有可能是因为bug出现的条件苛刻,无法证明故障真的解决了。

  针对这三个问题,笔者提出如下想法:

  虽然定位具体的出错信号很困难,但是定位是哪个模块出错很容易,在bug出现的时候我们可以抓出这个模块的全部输入信号,考虑是否可以利用这些信号在仿真环境下重建bug出现的条件,利用仿真环境具体定位错误信号的位置。

  定位好错误信号的具体位置后,修改代码,再用相同的条件进行仿真。这样可以通过对修改前后输出数据的对比,很直观的验证修改是否成功,从而在修改成功后只需编译一次即可,节省时间。

  上板后bug不复现也可以排除是由于极端情况很难满足造成的,去除了后顾之忧,彻底解决了故障。

  仿真解决故障的方法

  通过对这个异步FIFO问题的解决,可以证明这种通过所抓信号建立bug存在条件,定位、清除bug的方法是可行的。步骤如下:

  

  图3 SignalTap II List File界面

  ①将bug出现时SignalTap抓的信号保存成文档文件

  Quartus II 平台用SignalTap抓到信号的界面如图2所示。

  在信号名称上单击右键,选择图2所示Create SignalTap II List File选项,生成如图3格式界面。

  图3中界面上半部分显示的是list对信号个数及信号名的描述,下半部分是采样点所对应的信号值,带h的表示是十六进制数值。

  将list file另存为文本格式文件即可,如图4所示。

  

  图4 “另存为”选项界面

  此后可以把这个文本文件中无用的描述删掉,只留SignalTap抓出来的数据(空格、h等符号也要删掉),另存为.dat文件供仿真使用。

  有了故障出现时的输入数据,我们就可以在仿真环境下构建故障出现的条件。

  ②利用.dat文件建立bug出现的条件

  用verilog语言编写仿真文件(testbench),使用语句$readmemh或$readmemb将.dat文件中的数据存储到一个设定的ram中,如:$readmemh(“s.dat”,ram)。

  注意$readmemh读取是按照十六进制数据进行(认为.dat文件中的数据都是十六进制数),会自动将其转换为4位二进制数存入ram中,所以设定的ram位宽要是.dat文件中数据位宽的4倍;使用$readmemb时,存储SignalTap所抓信号时,信号都要先设定为binary类型,ram位宽就是.dat文件数据的位宽。ram的深度为.dat文件中数据的个数。

  然后在程序里把ram中数据按照所对应时钟沿输出到一个寄存器变量中,ram地址累加即可。

  always@(posedgeclk)

  begin

  data<=ram[addr];

  addr<=addr+1'b1;

  end

  复现bug存在条件时,需将模块的输入信号与ram中的数据位相对应,仿真文件调用模块时,将寄存器data对应位作为输入接入即可。

  在仿真环境中复现bug波形如图5所示。

  把图5和图1进行比较,可见通过这种方法我们在仿真环境下建立了bug出错时的环境,得到相同的输出出错数据。

  ③修改程序后在仿真环境验证修改是否成功

  修改程序后,我们只要使用同样的环境进行仿真,并且有针对性的观察bug是否解决。本例中出现bug的原因是使用了异步FIFO,改成同步FIFO后,问题应该就会解决,我们可以通过仿真验证。修改程序后仿真的波形如图6所示。

  由图6可见,修改后相同的条件FIFO读出4个数,说明没有读空,符合要求,bug解决。图7为版本编译后上板使用SignalTap抓取的信号波形,以作比较。

  

  图5 modelsim环境下复现的出错数据

  

  图6 修改程序后相同条件下的输出数据

  

  图7 修改程序后SignalTap抓的信号

  比较后易见,波形完全相同,说明方法可行。

  总结

  文中描述的方法可针对各种的故障的解决。在故障出现时,只需定位出错的模块,这些模块内嵌一些子模块也无妨;抓信号时将故障模块的输入输出信号抓出即可;利用输入信号重建故障环境,若仿真输出信号和所抓输出信号相同,说明故障环境建立正确;用这个仿真平台就可以具体定位是哪个子模块、哪个信号出错,而不需要在SignalTap中把这些信号抓出来;并且在修改代码后可以验证是否修改成功,节省时间,很明确的证明故障真的被解决了,事半功倍。

 

关键字:仿真方法  故障  Quartus  输出模块  bug  FPGA  dat文件  信号波形

来源: 中电网 引用地址:http://www.eeworld.com.cn/gykz/2008/0724/article_1100.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:CEVA被评为全球可授权DSP技术的领导厂商
下一篇:德仪新推出业界最低功耗的定点与浮点DSP

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MDK软件不能模拟仿真STM32的问题解决方法

“Options”对话框,切换到“Debug”,在“Initialization File”的右边单击,打开“选择仿真初始化文件”对话框,选择上一步保存的initmap.ini文件。单击“Edit”按扭,可打开文件再次修改。3 中断服务程序的执行与触发  当解决以上的两个问题后,可以进行模拟仿真调试。但这时中断服务程序不能执行,如系统定时中断程序;或者不能触发中断,如不能自动触发SPI中断程序等。由于已经把Flash存储器的起始地址调到了0x00000000处,所以也需要把中断向量偏移量地址设为0x00000000,即把SCB-﹥VTOR设为0。可通过如下方法解决。①对于通过访问SCB-﹥VTOR寄存器来修改中断向量的,可通过
发表于 2017-11-04 11:22:26

引用 IAR + Proteus7.6仿真MSP430单片机的设置方法

 WIND 的 IAR + Proteus7.6仿真MSP430单片机的设置方法         Proteus7.6增加了MSP430系列单片机,iar embedded workbench 和Proteus7.6联调可完成对MSP430的软件仿真,步骤如下。 1. 设置IAR软件,生产XX.HEX文件 (1)  在IAR建立MSP430工程及X.C文件,并编写X.C代码,界面如下图, (2)  设置IAR软件以生成X.HEX文件       
发表于 2016-05-12 09:35:20
引用 IAR + Proteus7.6仿真MSP430单片机的设置方法

用PROTEUS对单片机进行仿真的方法与实例

在单片机方面的仿真功能,即ISIS模块的用法。     在单片机学习开发的过程中,程序的调试是一个很重要的环节,要安装电路进行实验,而且电路在调试过程中往往要进行调整和改变,这不紧增加了费用和难度,而且也影响了学习和开发的进度,这也成了一些初学者学习的障碍。如果使用Proteus 软件就可以大大节省时间和开发费用,可以在软件仿真通过后再制作印刷电路板进行电路实验。 一、Proteus ISIS软件的工作环境和一些基本使用方法    下面通过一个流水灯的实例来说明Proteus的基本使用方法,使用的软件版本是Proteus.Professional 7.1 SP2。  
发表于 2015-10-27 08:29:26

ARM JTAG仿真器调试方法之SDRAM篇

    之前介绍了使用ARM JTAG仿真器将映像文件加载到ARM处理器内部SRAM中进行程序调试的方法,而在实际操作中,将映像文件加载到外部SDRAM中进行调试的方式更为常见。       要把映像文件加载到SDRAM中,除了要正确设置好映像文件的RO段基地址外(对于一个加载时域和运行时域相同的映像文件来说,RO段基地址实际上就是该映像文件在存储空间的起始地址),更关键的是要对SDRAM进行初始化。因为在上电时,SDRAM是没有被初始化的,所谓初始化SDRAM,就是要设置处理器的SDRAM空间以及读写SDRAM的时序参数,因而SDRAM
发表于 2015-10-15 10:10:32

松翰单片机仿真器外部rc振荡器的调试方法

松翰单片机仿真器的正确使用方法,和我想的不一样,如果外界而非的话,需要在仿真器内部更换晶振,江青曾替换为lc振荡器,这样,仿真器才能接受到,正常的时钟信号也就是外部提供的rc振荡器提供的信号,并且要注意编译选项中,选项中的变化,也就是highclk选项变化为extrc,其中的二可以选一个电位器,通过电位器的变化,就可以调节LCD震荡电路的时间常数,从而获得不同的时钟,在系统应用中这样可以,也可以通过软件的,调试,来获得比较精确的时钟,当然,当然,要通过定时器模块才能够实现精确的定食以及岩石,特别是对于pwm波形的产生,定时器的编程是一个非常值得注意的地方,也有很多的编程技巧,特别要注意如果一旦有毛刺产生,在程序中要做相应的修改.
发表于 2015-05-15 15:00:34

单片机软件仿真与调试的方法

全部排除。注意:有Errors不能Debug,也不产生HEX码,有Warning是允许的,可以运行。   5.调试程序   源程序编译通过,表明语法正确,却并不能保证该程序能够正确运行。还需要对其逻辑功能进行调试。Keil软件具有很强的软件仿真功能。   鼠标左击主菜单Debug一>Sta№top DebugSession子菜单或调试/编辑模式切换按钮。进入调试程序工作模式,软件窗口如图5所示。重复点击该按钮可以实现在编辑模式和调试模式之间进行切换。 图5程序调试运行。   调试程序时的程序运行控制按钮从左到右依次为复位、连续运行,暂停、单步、过程单步、执行完当前子程序、运行到光标当前行。复位按钮模拟芯片的复位
发表于 2015-03-26 12:17:49
单片机软件仿真与调试的方法

小广播

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved