热度 24
2012-8-22 09:29
6004 次阅读|
3 个评论
在 《时序优化一 例 (一)》 中采用修改代码的方法优化了一实例,通过加入一级流水线寄存器分割组合逻辑达到该路径时序收敛,但是重新 check 一下 timing 发现还有时序不满足,而且还是除法器 IP 核的时序未收敛,对于这官方提供的 IP 核那就没办法通过修改代码进行优化了。查了些资料,发现还可以通过物理综合优化,在没有使能物理综合前, QuartusII 软件只进行逻辑综合,逻辑综合中的时序仅限于综合后的门级电路或者器件内部的逻辑单元的时延信息,并没有包含布线时延信息,也就是说 Synthesis 与 fitter 并没有交互操作;而物理综合则在综合时考虑具体的布线时延信息,使获得不错的综合结果。 QuartusII 提供了几个选项,可以通过 Settings-Compilation Processing Settings-Physical Synthesis Optimization 打开,如图 1 所示。 图 1 其中主要分为两部分: 1. Optimize for Performance :主要用于优化性能 2. Optimize for fitting :主要用于优化 fitter 与时序相关的就是第 1 部分( Optimize for Performance )了,翻阅了官方手册,找到了对应各选项的解释。 Perform physical synthesis for combinational logic :通过交换 LEs 中 LUT port 来减少关键路径的逻辑层数目,同时还会通过复制 LUT 解决扇出过大的问题,此选项只影响 combinational logic ,并不对 register 进行优化; Perform register retiming :关于 register retiming 的概念,主要是为了解决关键路径逻辑过长的问题,通过在 combinational logic 中移动 register ,利用宽松路径的余量来补偿关键路径进行优化; Perform automatic asynchronous signal pipeline :该选项是在 fitter 时自动加入针对异步 clear 或 load 信号的流水线级来优化性能,特别是在 recovery 和 removal slack 未达到时序要求时可以使能这一选项; Perform register duplication :自动复制 register 优化高扇出的问题。 图 2 针对设计,通过查看关键路径,如图 2 所示,发现逻辑级数达到 33 ,这与第一个选项: Perform physical synthesis for combinational logic 所能解决的问题比较匹配,使能第一个选项,看一下优化结果: 图 3 优化前 如图 3 所示为优化前的时序波形图,时序未收敛,关键路径上 Data Delay 过大,达到 4.335ns 。 图 4 优化后 如图 4 所示为经过优化后原先关键路径的时序波形图,发现该路径已达到收敛, Data Path 的时延仅 3.464ns ,留给建立时间 0.126ns 的余量。因此选项: Perform physical synthesis for combinational logic 确实达到了优化的目的,下面来查看一下软件是如何自动优化的: 图 5 优化后 如图 5 所示优化后的 Technology Map 图,发现逻辑级数还是很多,查看 TimeQuest Timing Analyzer 中的统计, logic lever 还是有 32 级,相比于优化前仅少了 1 级,估计这 1 级也不是使路径时序收敛的关键,还需继续深入探究。 图 6 优化前 Data Path 图 7 优化后 Data Path 如图 6 、 7 所示,通过比较优化前和优化后的 Data Path ,根据上面分析,优化前 Data Path 总时延为 4.335ns ,而优化后仅为 3.464ns ,相差 0.841ns ,这足够使路径达到时序收敛。仔细比较优化前后的 Data Path ,发现共有两处差别: 1. 在逻辑中少了 1 级,原先连接这级逻辑的路径时延发生了变化 ( a )优化前 ( b )优化后 图 8 通过图 8 中优化前后的对比,优化后少了 Div_0|LPM_DIVIDE_component|auto_generat ed|divider|divider|add_sub_16|op_1~9| 这一级,减少了布线延时,时延方面从 0.310+0.801+0.440+0.000+0.055=1.606ns 减少到 0.310+0.239+0.733=1.282ns , ( a )优化前 ( b )优化后 图 9 2. 如图 9 所示为第二处差别,此处具有相同的路径,节点的扇出也相同,就是时延发生了变化,节点 Div_0|LPM_DIVIDE_component|auto_generated|divider|divider|add_sub _16|op_1~73|sumout 到节点 Div_0|LPM_DIVIDE_component|auto_generated|divider|divi der|DFFStage |sload 的时延从 0.483ns 减少到了 0.114ns ,这就很奇怪啊,查看 Technology Map 肯定看不出什么区别了,因为它们路径两端的节点是相同的,那只能通过 Chip Planner 查看底层是如何布线的了。 ( a )优化前 ( b )优化后 图 10 通过对比图 10 中( a )和( b ),发现优化前这一小段路径横跨了好几个 LAB ,导致时延比较大,而优化后该段路径在一个 LAB 就内部消化了,软件自动对关键路径的布线进行了优化。 图 11 经过以上优化和分析,原先的关键路径时序收敛了,那整个设计的时序是否收敛了呢?那就重新 check 一下 timing 吧,很遗憾,还是不满足,如图 11 所示,不过庆幸的是 setup slack 提高了些,到 -0.240ns 了,不然这优化算是白费了。 总结:此次优化是通过软件自动进行的,通过查找问题使能了对应选项,这种针对性的优化效果还是很明显的。在我尝试其它选项进行优化后发现几乎没有什么效果,甚至使问题更加恶化了,因此采用软件自动优化时不能太盲目,认为将所有优化选项都使能就是最佳的,必须根据设计本身的问题采取针对性的优化方案。 革命尚未结束,咱还需继续努力!