引言 随着芯片设计技术越来越成熟,越来越多的产品选择使用SoC(System on Chip)的技术实现。然而,每一次流片不一定都能达到预期的效果。根据Synopsys公司统计,有超过60%的公司需要重新流片(respin)。在这个过程中浪费了大量的金钱,一次修正平均的花费就超过100万美元。如果一旦错过了商品推出的最佳时机,那么错过市场机会的代价则以数千万美元计,甚至更高。据统计,在需要respin的芯片中有43%是在前端的设计和实现的时候产生的逻辑功能错误。如何避免或减小如此高的风险是每一个设计单位思考的问题。
现在行业内有两种解决此问题的方案,第一种方案是利用越来越先进的EDA仿真工具仿真测试。业界产品的两大巨头Synopsys和Cadance都推出了自己的解决方案。然而,EDA工具非常昂贵,却不一定能满足每一个项目的要求。另外,EDA工具的仿真时间很长。用一套无线通信系统举例,初始化的过程就需要半天的时间,每收发一帧都需要3-4个小时,因此在有限的时间内不可能完成比较全面的测试(测试时采取的都是并行运算的方式,工作站都是Sun Blade2000的配置)。最后,仿真软件再完善也不是实际的硬件操作,因此某些只可能在硬件上发生的问题,无法通过仿真来获得。比如某些时序问题和功耗问题。另外,硬件的"脾气"比较古怪,经常会出现一些意想不到的状态,这些都是仿真软件无法模拟出来的。第二种解决方案是采用FPGA进行真实的硬件测试。比如Xilinx公司的EasyPath解决方案。然而使用这种方案也面临着一些需要解决的问题,比如如何使设计的产品可以既在ASIC上工作,又在FPGA上正常工作,如何保证FPGA与ASIC的一致性。针对这些问题的解决方法是本文重点讨论的内容。
本文的测试实例和测试方法均来源于北京市嵌入式重点实验室的无线局域网芯片项目,本项目的产品目前已经成功流片。这些测试方法的应用对项目的顺利进展起到了关键性的作用,起到了良好的效果。
时序问题的解决 我们知道FPGA可以接受的时钟和所允许的时序远远低于ASIC。但作为ASIC产品而言,我们在设计的时候又往往采取较高的时钟速率。由于ASIC时钟树与布线相对自由,故对于高速率设计解决起来相对容易。对于Xilinx FPGA而言,尽管采用了90nm工艺的Virtex-4可以支持的性能高达500M[1],但是其时钟树和布线资源相对固定,因此一旦在编译和布局布线的时候处理不当,就会产生时序冲突(timing violation)。产生时序冲突的结果,轻则使设计的逻辑与实际布局布线后的网表不一致,重则导致布局布线根本无法通过,从而致使验证无法进行。
我们在解决时序问题的时候采取了五种不同的方法。其中一种方法是应在设计中就加以注意,两种在综合的时候进行,还有两种在布局布线时采用。
设计过程中注意时序问题 若希望设计的产品能够在FPGA验证平台上顺利的完成验证,在设计过程中就需要注意尽量多的使用FPGA的内部资源,如DSP48,乘法器,RAM,DCM等。
在我们的设计中有不少滤波器,这些滤波器正好可以使用DSP48[2]这个模块。该模块如图-1所示,为乘加结构。滤波器若不使用这种模块,则需进行大量的乘、加运算。这样不但浪费资源,而且很容易导致时序无法满足要求。而如果使用这样的模块,则基本上所有的滤波器都不再处于"最差路径"上。
图 1 DSP48示意图 对于乘法器,如果使用slice搭建不仅浪费资源,而且性能差,位宽一旦比较宽就会导致时序出现问题。Xilinx的ISE中配有Core Generator这个工具。通过该工具可以生成需要的乘法器。使用这些乘法器来代替普通的乘法器,可以达到满意的效果。除了乘法器,还可以使用该工具产生RAM和DCM等,在此不再赘述。
综合过程解决时序问题
我们使用Synplicity公司的Synplify工具进行综合,这是业界通常使用的综合工具之一。选择该工具最主要的原因在于它与Xilinx的FPGA配合的很好。我们做过实验,通过该工具综合产生结果报表,再通过ISE产生真实布局布线后的报表。对这两个报表的时序估计部分进行对比,我们发现两者之间惊人的相似,最差路径之间的差别不超过1ns。
我们知道,综合的时候需要设置约束,最重要的是时钟约束。这个约束限制了系统工作的频率。为了降低系统对于时钟抖动的敏感性,我们采取的第一个方法是在设置时钟约束的时候将此约束值设的略高于实际的时钟频率。这样做有一个前提,那就是在综合后不得有负的时钟余度(time slack)出现。当没有负的时钟余度出现的时候,提高时钟约束可以有效避免因时钟抖动而引入的时序问题,但是如果因为提高了约束中时钟频率,而导致负的时钟余度的出现,那么有可能导致在布局布线过程中产生时序冲突而无法正常布局布线。在这种情形下,就不宜提高约束中的时钟频率。
在综合中采取的第二个方法是使用综合工具提供的pipeline和retiming功能[3]。这些功能可以调整寄存器的位置,使之在不改变逻辑的前提下,将寄存器的位置调整的更加合理,如图-2所示。这个功能主要用于组合逻辑过长且不合理的情况下。当然,如果某些乘法器位数过宽而结果没有寄存的时候也会导致组合逻辑时序紧张。当发生这种情况而retiming功能又无法纠正时,就需要设计者在做设计的时候对乘法器的输出结果做一拍寄存,同时其余的控制逻辑也要做相应的调整。
图 2 retiming 示意图 布局布线阶段解决时序问题
当综合工作完成,进入布局布线的阶段后,仍然有两种方法可以改善逻辑时序问题。
第一种是手动增加并调整BUFG(Global Clock Buffer)。BUFG是Xilinx的全局时钟资源,所有时钟树的起点都是BUFG,位于FPGA的北极和南极。当布线后仍有负的slack时,有可能是某些当作时钟使用的信号没有被放上时钟树,此时就要手动将这些信号放上BUFG。若遇到门控时钟,还应该使用BUFGMUX资源。另外,在Virtex-4中,北边的BUFG主要负责北部的时钟,南部的BUFG负责南部的时钟。在我们的项目中,共有十余个时钟,因此,BUFG位置的选择也很关键。有些时候,工具不能解决一切问题,只有手动调整BUFG的位置,或将BUFG的位置信息写入用户约束文件才可以取得较满意的效果。
在Virtex-4中共有16个BUFG,若都被使用且经手动优化后仍不满足要求 ,那么还可以使用ISE提供的Floorplanner工具,对设计的各个模块手动进行位置摆放,使各个模块尽量靠近自己所使用的时钟树。
代码一致性
对于经过FPGA验证的代码而言,最担心的是经过验证的代码和进行流片的代码不一致。导致这个现象产生的原因是多种的,其中版本控制和由于FPGA、ASIC专用器件不一致而引起的问题是最常见的两个问题。前者不在本文的讨论范围,故在此略过。
对于经过FPGA验证的代码,为了能够使被测代码可以顺利的在FPGA进行验证,根据2.1节所述,一般都采取了FPGA专用的器件。这些FPGA专用器件在ASIC中是不存在的。为了解决这个问题,我们通常采取"假代码"(Fake Code)解决。
顾名思义,"假代码"就是在代码中保留FPGA专用器件的名称和接口,但是在FPGA和ASIC中使用不同的器件内核。该器件若在FPGA下使用则使用FPGA专用器件,若在ASIC下使用,则使用自己编写的代码。尽管这种做法仍然无法保证代码的完全一致,但是却最大限度的避免了代码的差别。
结论
究竟使用EDA 仿真工具还是使用FPGA进行流片前的功能验证一直是业内讨论的热点话题,不同的设计、测试人员也有自己的观点。本文针对使用FPGA进行验证测试所遇到的一些问题提出了相应的解决方法,对于使用FPGA进行验证测试的工程师有一定的参考意义。
点击浏览:矢量网络分析仪、频谱仪、示波器,使用操作培训教程
上一篇:手机射频电路设计的差分散射参数测试
下一篇:实现WLAN基频发射模块测试系统
矢网、频谱仪、示波器、信号源等培训教程合集,购买合集更实惠,让您快速熟悉和精通各种仪器操作【More..】
射频工程师养成培训课程套装,专家授课,让您快速成为一名优秀的射频工程师【More..】
网站地图
| |