过去二十年中,一种被称为数字信号处理(DSP)的技术在我们日常生活中越来越普遍。DSP是现代无线和有线通信、医疗诊断设备、军事系统、音频视频设备以及大量其他产品的基础。
由于半导体技术的进步,非常复杂的DSP算法、协议以及应用都被实现了,这样也反过来增加了这些系统和产品的复杂度。随着系统复杂度的提高,系统可靠性不再仅仅以硬件平台的可靠性来定义,它一般采用MTBF(平均故障间隔时间)来定量计算。现在的系统可靠性越来越多的由硬件和软件体系结构、开发和验证过程以及设计可维护性等级来确定。
基本体系结构的问题之一是DSP平台的类型。数字信号处理功能一般在两类可编程平台上实现;数字信号处理器(DSP)和现场可编程门阵列(FPGA)。DSP是一种特殊的微处理器,而FPGA是一种配置能力很强的硬件。过去,DSP的应用非常普遍,而大量的应用需求超出了DSP的处理能力(MIPS),这使得FPGA流行起来。目前,大部分工程师采用FPGA而不是DSP的主要原因在于应用的MIPS要求。因此,对比DSP和FPGA时,共同的焦点是MIPS,当然这很重要,而FPGA的优势不限于此。同样重要而经常被忽视的是FPGA在产品可靠性和可维护性上的内在优势。本文主要讨论第二种优势。
图1 DSP结构图(略)
几乎所有的工程项目经理都能说出下一软件更新或者版本发布的日期。大部分技术公司在内部有软件缺陷或者问题报告的清单,标明哪一软件版本将提供相关的补丁或者改进措施。大家普遍认为所有的软件(DSP代码也被认为是一类软件)都有某些缺陷,而最好的方法是减少这些缺陷。
作为对比,FPGA设计不会频繁地更新,生产商一般很少发布FPGA配置文件的现场更新版本。
为什么?DSP和FPGA的工程开发过程有很大的区别。为任何类型的处理器开发复杂软件都有一些基本问题。本质上,DSP基本是专用处理引擎,针对大量不同的任务进行重新配置,某些数字信号处理则完成更多的控制或者专用协议任务。所有任务共享处理器内核寄存器、内部和外部存储器、DMA引擎以及IO外设等资源,这些任务通常被称为“线程”。一个任务很有可能和其他任务相互影响,这类影响一般出乎人们的意料,不容易察觉。而且,大部分DSP算法必须“实时”运行,因此,意外的延时或者等待都会导致系统出现故障。DSP软件缺陷的主要原因有:
同时开发并集成不同功能的工程师没有对处理器资源进行统一规划
完成时,处理器完全复位中断失败。
另一中断或者非中断过程将关键中断阻塞
未发现的指针损坏或者未初始化指针
没有正确地初始化或者禁止循环缓冲寻址模式
?由于线程结束时释放所有存储器失败,导致存储器漏出,或者易失存储器逐渐耗尽。
DSP例程对特定变量存储器安排的依赖性
没有预料到的存储器优化链接器/编译器对存储器的重新安排
?使用特殊DSP“代码模式”指令选项
外设访问冲突或者过度延时,例如DMA、串行端口、L1,L2、以及外部SDRAM存储器等。
堆栈或者信号机损坏
子程序执行时间依赖于输入数据或者配置
C语言或者高级语言子程序与汇编语言子程序混合
某些汇编指令的流水线限制
微处理器、DSP和操作系统(OS)供应商一直试图通过在任务或者“线程”之间建立不同等级的保护和隔离措施来解决这些问题。操作系统或者内核一般用于管理处理器资源访问,例如允许执行时间、存储器或者公用外设资源等。但是,处理效率和OS所提供的保护等级之间有内在冲突。在DSP中,处理效率和确定性延迟非常重要,结果通常是任务之间的OS隔离等级很低甚至没有隔离。每一任务为了提高运行效率,对大量的处理器资源进行不加限制的访问。
在开发初期以及随后的代码发布回归测试阶段,还没有对这些开发问题进行完全验证。在现场工作期间,几乎不可能测试不同任务和线程之间所有的排列(通常称为“边角问题”)和相互影响。这使得软件测试成为软件开发过程中最难处理的部分,对此可以展开讨论。即使采用自动测试脚本,也不可能测试所有可能的情况。每次软件更新或者修改后,必须重复这一过程,来纠正已有的缺陷或者增加新功能。有时候,新发布的软件就有新缺陷,迫使发布另一版本来纠正新缺陷。由于产品越来越复杂,代码行数在增加,处理器内核的数量也在增加,需要更大的投入来进行软件测试。
改进FPGA开发过程
对于这种不好的状态,FPGA开发过程是怎样对其进行改进的呢?
在 每一任务或者线程的实际设计中,不论使用DSP还是FPGA,其复杂程度都差不多。FPGA和DSP可以使用第三方工具来实现常用的信号处理算法、接口和协议。每一工具都能够在今后的设计中重复使用现有的IP。但在这方面开始出现差异。
FPGA能够更自然地实现大部分数字信号处理算法。每一任务都分配有自己的资源,独立运行。直觉上这样会更好一些,在类似汇编语言的程序中处理连续流信号过程链的每一步,为每一步提供专用资源。正如Henry Ford在100年前所发现的那样,结果是大大提高了吞吐量。
可以根据任务需求来定制FPGA资源分配。按照逻辑划分来分解任务。这有助于定义好任务之间的接口,大大消除了任务之间意外的相互影响。由于每一任务都能连续运行,对存储器的要求大大低于DSP,而DSP必须以批处理的方式来缓冲数据和程序。由于FPGA在整个器件中分配存储器资源,每一任务几乎都永久分配了所需的专用存储资源。这样实现了任务之间的高度隔离。结果,对一个任务的修改不会导致另一任务出现异常行为。因此,开发人员能够以可预测的方式更合理直接地隔离并修复缺陷。
FPGA设计验证
基本上,FPGA设计和验证工具与ASIC开发工具密切相关。在实际中,大部分ASIC设计都在FPGA中进行原型开发。这一点非常重要,因为ASIC中一定不能出现缺陷。由于有可能通过远程现场更新来改正ASIC中的设计缺陷,而时间和开发成本非常高,ASIC开发人员需要花费很长的时间来验证几乎所有情况下的设计问题。这导致所采用的测试方法要覆盖所有逻辑门的可能输入,对器件内部的布线延迟进行精确建模,全面分析时序。由于FPGA验证工具与对应的ASIC工具密切相关,因此,在ASIC验证上的大量投入非常有利于该工具的发展。
FPGA划分、测试台以及仿真模型的应用提高了集成和回归测试的效率,能够迅速隔离问题,加速了开发过程,简化了产品维护,并能够方便地增加新功能。这是FPGA相比于DSP开发过程的关键优势,随着设计复杂度的提高以及开发团队规模的扩大,这一优势会更加突出。
图2 FPGA结构图(略)
FPGA供应商提供全套的内部和第三方工具,实现体系结构、划分和平面规划的统一工具流程,推动设计目标、仿真、时序逼近、优化和可维护性的发展。尤其重要的是,划分成为设计输入过程中不可分割的一部分。划分通常包括分区中所需的全部芯片资源,在时序逼近和以后开发的维护阶段,会扩大分区的规模,能够保证实现更好的隔离。每一逻辑分区以及总体设计都可以有独立的测试台和仿真模型。
很多行业(电子设计自动化和EDA行业)推动了FPGA和ASIC测试验证工具的不断发展。在软件开发中没有完全一样的东西。随着业界对软件验证高成本和困难问题的解决,这一情况会发生改变,但是目前为止,软件行业的实际解决方案是不断下载最新的补丁。
很 多工程管理人员对此非常明白。软件缺陷更新的速度要远远超过类似FPGA更新的速度。经常对嵌入式软件缺陷进行改进在大家的预料之中,比较正常。随着针对DSP优化的低成本和高端FPGA器件的推出,考虑到大量的可用IP内核、高级设计输入方法以及设计和验证过程内在的可靠性,FPGA将逐步成为实现数字信号处理的最佳选择 。 |