特权和你一起学NIOS2 第五章 实战演练之时序收敛 part1
0赞写在前面的话:
特权同学花了很多时间在这一章上,甚至当初写《深入浅出玩转FPGA》的时候都没有这样投入过。因为觉得这个时序分析不仅重要,不仅对初学者来说有难度有深度,而且其中还有很多技巧和方法是非常值得总结和归纳的。特权同学虽然以往对这些知识点有过学习,有过实践,也有过总结,但是又一次对这些知识点的重新梳理才发觉其实还可以更深入。学无止境,站在前人(或者说是自己过往认知的基础上)的肩膀上我们可以看得更远,探得更深,摸得更透……
为了不让大家等得太久,这一章分成多部分以博文形式发表,谢谢大家的支持!也很希望听到反馈的声音,你的问题也许就是我的疏忽。
特权同学在《深入浅出玩转FPGA》一书中也专门有章节和大家探讨时序相关概念,并且有数篇针对TimeQuest的分析案例。但其实很多人还是对这个熟悉而又陌生的知识点望而生畏,觉得无从下手。在初学时,特权同学也有过同样的困惑。但是今天回头看看过去走过的路,发现其实会与不会、懂与不懂之间只是隔了一层薄薄的窗纸而已,只要鼓起勇气花点时间费点精力再用点方法就足以捅破它,迎接你的将会是“柳暗花明又一村”式的豁朗开朗。
咱先在正式入题之前再说些乱七八糟的话题,因为我想,当你的注意力被吸引过来了,我们就可以专心的学习了。昨晚在几位刚毕业(有的还在待业)的年轻人住处聚会(不要误会,是基督徒的聚会,我们在一起读圣经),会后小洪还有特权同学留下和这些“小朋友”们私下谈论了一些话题。因为小洪是比较能耐的过来人,所以话题涉及了工作、创业、公司管理经营的一些想法和理念。讲到创业,一个公司的第一个亿销售额可能需要三年五年甚至更长时间;然而第二个亿往往就不需要这么久了,会大大的缩短,可能只需要一年两年甚至更快。中文有一个成语很恰当的形容这种现象,叫“厚积薄发”。学习的过程也是这样,学FPGA我们不用拿年来算,我们只要用心去学,我们所花的每一分每一秒,我们所掌握的每一个知识点,有一天都可能成为我们理解下一个知识点的“跳板”。当这些“跳板”越来越多的时候,我们前进的步伐也就顺理成章的越来越快。世上本没有免费的午餐(当然,如果你成为基督徒,那么免费的午餐不仅有,而且会越来越多,我们称之为“爱宴”。因为在基督徒中间所传递的是真爱,无条件的爱,当你被这种爱包围的时候,你也会愿意用这种爱去体贴顾惜他人。),要得到一些东西总是要付出一些东西(马经称之为“等价交换”)。你付出的越多得到的自然也会越多,但是事物的发展也是需要遵循一些规律的,学习这种付出得到的常常不会是45度斜线式的等比回报,更多的时候它就好像(对不起,特权同学想说的这种波形太抽象了,都不知道该如何形容了)……用马克思的话来描述就是:前途是光明的,道路是曲折的,在曲折中前进。最后,用圣经节来结束这个话题吧,路加福音6章38节说:你们要给人,就必有给你们的,用十足的量器,连摇带按,上尖下流的倒在你们怀里;因为你们用什么量器量给人,也必用什么量器量给你们。
时序设计四部曲
说时序,这回要真刀真枪的细细的来讲,那么我们还是应该先掌握一些必须的背景知识。解决几个问题,我想这些问题很可能是大多数初学者没有搞明白的。
如何做时序分析?在整个设计的哪个环节需要进行时序约束?如何给设计添加时序约束?如何查看时序报告?如何达到时序收敛?这些疑问其实已经包含了我们接下来要谈的四部曲,即时序分析、时序约束、时序报告、时序收敛。这里事先申明,所谓四部曲不是任何官方提出来的概念,是特权同学对时序设计在FPGA流程中的理解总结出来的。
如图5.1所示,在整个FPGA流程中,时序约束是在设计输入完成(这个“完成”包含了代码编写好、系统集成好、并且通过综合和功能仿真验证后)并进行了一次编译后进行的。如果不进行编译,那么设计者很可能无法找到需要约束的路径,甚至摸不清楚有哪些路径是需要约束的,因此,时序约束前的编译必不可少。时序约束后还需要执行一次编译,这次编译是让开发工具按照设计者的期望(体现到和工具交互的手段就是“时序约束”)去综合与实现,最后用户通过观察时序报告来验证时序是否达到要求。
图5.1
上面是从整个FPGA开发流程的角度来理解时序设计。下面要从时序设计本身来理解,即四部曲之间到底有怎样的关系。如图5.2所示,时序约束也逃不了FPGA固有的迭代特性。在整个系统的功能定型后,设计者需要做的一项工作就是时序分析,这个分析在时序设计的初期可能只是系统的时钟频率考虑以及与FPGA接口的外围器件时序要求考虑。系统时钟考虑是最简单的,FPGA的时钟源通常是外部晶振,但也许这个晶振频率只是作为FPGA内部时钟管理单元的一个基准输入时钟,而FPGA内部跑的时钟频率也通常不完全一致,时钟管理单元可以产生多个不同频率的时钟。无论如何,这些作为FPGA系统内部的时钟频率是确定的,至少应该是设计者心中有数的。那么,在时序约束时,按照它们需要跑到的频率去约束它们。而与FPGA接口的外围器件通常也都有时序要求,尤其是一些高频传输接口,如果不做好时序分析与约束,甚至会导致系统无法正常工作。这时候需要去翻看对应器件的datasheet,通常直接去找图图和表表就行,图即时序图,表即对应时序图的时间表。这两样东西分析透了,才能够做出正确的约束,而不是错误的过约束或欠约束。
图5.2
做好第一步的时序分析,那么就能够进行恰当的时序约束。时序约束是需要通过开发工具来协助的,Quartus II内嵌的TimeQuest就是我们的利器,它能够帮助我们完成整个时序设计。时序报告也是在TimeQuest内产生的,前面提到了在时序约束后的一次编译过程中工具会尽可能的来满足设计者的要求,最终却是通过时序报告来体现工具的“劳动成果”。在时序报告中,我们可以查看已经约束的路径是否达到既定要求,没达到要求的在TimeQuest中会用红色字体警示。当然了,TimeQuest还提供了一些叫做“时序例外”的约束方法,所谓“时序例外”,就是当我们查看时序报告确定时序不收敛(所谓收敛,就是时序完全达到要求)的时候,我们如果找到一些时序要求本来并不高,但是我们的约束却比较紧,并且很多时候这些路径也达到了要求,这时候我们就有必要放宽对这些路径的要求,让原本花费在它们身上的努力转嫁到其它还没有达到时序要求的关键路径上。此时,我们所做的工作就叫做时序例外约束,它主要是指false路径约束(即不约束这个路径,通常能够用这种约束的路径是系统运行过程中从始至终不曾变化或完全无关紧要的路径)和多周期路径约束(能够使用该约束的比较典型的是多个时钟周期数据才会变化一次的路径)。
时序设计的第一轮是验证原始约束是否达到要求,一般很难一次性成功(不排除系统性能要求不高的情况下一次性成功)。那么第二轮就需要结合时序报告中的各种路径(包括失败路径和一些可能的过约束路径),并重新考量第一轮的时序分析是否有偏差。最后可能需要对原来的路径约束做一些更改,或者添加一些时序例外约束。然后重新编译,重新分析时序报告并验证时序是否收敛,如此往复恩轮,直到最后时序完全收敛。忘了看过哪位“大虾”的文章,说时序收敛的过程是“打鼹鼠”,特权同学非常赞同,时序报告中体现出来的结果往往是各个区域路径“此起彼伏”式的失败与成功的交错。总之,时序设计师一项费时费力费脑子的活。
当然了,其实时序设计并不是独立于FPGA开发流程的其他环节的。在很多极端的情况下,光靠上面的一些反复更改约束并不一定能够解决时序问题。这时候也许需要对工具的Systhesis选项或者Fitter选项做一些设置,再或者回到源代码进行优化,其实这时候的工作就成了整个流程迭代性的一部分。