作为ASIC领域中一种半定制电路,FPGA的发展不但解决了定制电路不足,并且能够克服可编程器件门电路数有限的特点。再加上FPGA自身具有的设计周期短、开发成本低和设计灵活等特点,基于FPGA的开发越来越流行。为了帮助大家解决FPGA开发中碰到的相关问题,电子发烧友网和FPGA资深工程师吴厚航(网名“特权同学”)进行了深入的交谈,希望能为工程师群体在电子设计道路上提供参考。
大家知道在FPGA设计中,时序设计是至关重要的,通过时序设计去满足每一个触发器的建立和保持时间的要求,是FPGA设计中的重点。大家虽然知道这是很重要的,但对于时序设计为什么在FPGA设计中如此重要,或许知其然而不知其所以然。
电子发烧友网就此事咨询了特权同学。特权同学认为,如果想了解一个人的FPGA设计开发水平,只需要看他们所作的FPGA设计中是否进行了时序约束、如何约束及其相关的细节便可八九不离十的得出结论。由此可见,时序设计在整个FPGA开发过程中的重要性不言而喻。特权同学从FPGA的设计出发,给我们阐述了时序设计的重要性。
如图所示,这是一个典型的FPGA开发流程图,当然并不是一个非常全面完整的流程图,但是至少我们可以从这些箭头关系得知FPGA设计一个特有的迭代性。这和大多数以往我们所接触过的纯软件或纯硬件开发都不一样。FPGA开发的迭代性,意味着设计过程中的每一个环节出现差错,都可能导致整个系统推倒重来,回到起点。
就拿当前我们所讨论的时序设计来说,在时序约束阶段,如果我们得到的时序报告中很多时序路径违规,无法达到既定要求,那么我们会一步一步往回找问题的解决办法,先是确认时序约束本身的合理性(尤其不要有过约束);接着在实现阶段和综合阶段找办法,主要是通过工具选项进行一些特定的优化设置;再搞不定就要修改代码,从根本上进行设计逻辑和路径的优化;有人关心还是搞不定怎么办,只能告诉你需求分析不到位,你的器件选型恐怕有待商榷了。这么看下来,FPGA设计还真是环环相扣,每个步骤都来不得一点马虎。
特权同学通过FPGA设计入手,给我们初步解析了为什么时序设计会是这么重要。但作为工程师的我们,既然已经更明白到其重要性,那就要去深入了解其中的问题,为我们日后的开发提供需要注意的参考。
根据特权同学的看法,时序设计通常可以大致的分为时序分析、时序约束、时序报告、时序收敛(这在笔者所著的《爱上FPGA开发——特权和你一起学NIOSII》一书第4章有详细介绍)四个阶段。每个阶段都很关键,都不能够随意敷衍了事。
尤其是时序分析阶段,虽然对于基础理论知识,我们可能都能够理解和领会,但工程实践中遇到的各种情况恐怕要比理想公式的关系复杂得多。因此,在掌握了理想时序分析模型的理论知识之后,要能够活学活用,遇到各种复杂的情况要能够灵活变通,特别是FPGA和外部芯片接口的时序设计上,不同的外部芯片给出的时序信息良莠不齐,就很考验我们的分析能力。
当然了,话说回来,实际情况虽然不同,但是我们将这些复杂情况提炼出来的基本模型都是“万变不离其宗”的,最终考验的还是我们“化繁为简”的能力。所以,每位做时序分析的工程师,都需要特别注意锻炼自己在这一方面的功力。
我们之前有提过,如何从实际出发了解时序分析的问题。接下来特权同学会给我们介绍他在FPGA时序设计中碰到的问题。
特权同学说到在刚刚开始做FPGA的项目时,由于经验所限,很多陷阱和弯路都走了个遍。这里举一个跨时钟域的时序问题:
这是一个FPGA内嵌硬核CPU的系统,它的软件代码在每次上电时从一颗外部的FLASH中加载。CPU本身只有一组总线接口,这个总线接口的逻辑都是自己设计的,FLASH运行软件的代码是直接使用了官方给出的源代码。因此,一开始只是想当然的将FLASH和CPU按照实例“对接”上了。却忽视了例化中供给二者的时钟不同,CPU跑得频率是FLASH频率的3倍多。
=================================
说不清道不明的“幽灵”现象
于是在实际调试中,出现了很多说不清道不明的“幽灵”现象。通常断电较长时间后若给芯片供电,第一次没反应,第二次通常就起来了,然后不停的上下电,一般也都能够起来,我们笑称“是不是这个芯片要充电啊”。但是从始至终居然有那么一个样机(一共有四套)非常坚挺的从来不出这个症状。开始我们一直怀疑是芯片厂商提供的所谓“工程样片”有猫腻,但是随着调试不断的深入,工程代码改进后不断产生新的编译结果,有些工程的逻辑编译居然无论如何都无法让工程跑起来,对比前后能跑和不能跑的工程,改动的地方确认是一些无关紧要的逻辑。
和FAE谈到这些比较怪异的症状,并且我们也聊到了软件是从FLASH加载的,聊到了它们的时钟频率,FAE给了我一些启发和灵感。于是深入的去解析那份“舶来品”,发现了CPU读写代码接口中的等待信号非常可能就是罪魁祸首。
我们做了一个假设,比如CPU以100MHz在跑,FLASH操作是20MHz。CPU需要每若干个时钟周期执行一次软件代码读操作,FLASH要响应这样一次操作要慢很多,因此FLASH就是通过wait信号来拖长CPU的操作时间,以保证完成这样的一次读操作。那么wait信号是由FLASH的时钟产生的,它会比CPU的时钟慢很多。
存在那么一种情况,当CPU执行第一个读操作时,好不容易等到了FLASH模块的wait信号,然后发出第二次的读操作,而此时由于这个wait信号保持的时间还未结束,那么CPU误以为是给它的wait信号了,所以接着往下走了。如此一来,软件就大乱了。
这般推测后,特权同学适时的对这个wait信号的产生逻辑做了一些处理,同时也明确的对此处的时钟进行了约束,此后经过恩天的验证果然不再有芯片在上电后无法运行的情况了。
我们在碰到问题的时候,最主要的是要了解全面的分析方法,在FPGA设计方面,这些分析方法尤其重要。特权同学认为,在FPGA开发过程中,不遇到问题是不可能的,时序问题的分析定位往往也是难上加难。很
多时候在调试后期,特别是板级调试阶段,一个bug的出现,可能涉及FPGA内部的逻辑功能性错误或时序错误,也可能涉及到FPGA的硬件板级电路,如供电电路、外部芯片等的错误,这些错综复杂的情况往往让调试者晕头转向。
而在应对这些问题时,以笔者的经验,首先要定位好问题所在,就要采取排除法,独立各个模块,先缩小问题的范围。接着有针对性的进行具体问题的排查,直到找着问题的根本原因。当然了,有时候某些问题可能不是单一故障引发的,或许有多种因素,这时候就要多从理论进行分析,多做试验进一步排查了。总之,这是一项很锻炼人的工作,很多工作也是建立在过往经验的基础上进行的。
所以,作为一个工程师,笔者非常推崇大家从一开始就养成较真的习惯,遇到问题就一定要弄明白,并且将所遇到的问题落实到笔头,以报告的形式记录下来,当然不只是拿这样的报告去邀功请赏而已,更多的是借助报告撰写的过程提高自身的知识储备,毕竟每一个论点和论据的支撑都需要涉及大量的理论知识。
到现在,现在大家对特权同学的这种FPGA思维和经验很敬仰吧。但谁也不是一蹴而就的,下面我们就让特权同学这个先行者给我们这些后来者分享相关经验。
他认为电子技术的发展日新月异,若想成为一个称职的FPGA工程师,保持一颗谦卑的心态非常重要。
笔者记忆中对一位小学老师的毕业留言印象深刻,那便是“学习学习再学习”这句让人终身受用的良言。笔者在电子发烧友的FPGA在线讲座中曾引述过一位业内前辈对FPGA发展的三个阶段划分,即入门阶段、进阶阶段和从业阶段。每个阶段都是一个学习的过程,甚至在从业阶段更是如此,面对纷繁复杂的设计和调试局面,如果没有很强的再学习欲望和能力,有时真的很难招架应对。
在入门阶段和进阶阶段,掌握了FPGA设计的各种基本技能,在工程实践中便应该尽可能的遵循规范的开发流程,不要投机取巧甚至“偷工减料”,只有严谨认真的面对每一个设计项目,才可能高效、出色的完成任务。而这种严谨认真的态度,从一开始就应该养成。俗话说“习惯决定性格,性格决定命运”,笔者想说的其实也是这样一个浅显的道理。
不知道大家对这期的技术文章了解如何,作为小编的我,可从吴老师身上学到了很多。希望能够给电子工程师提供设计参考价值。