图4 在Quartus GUI中创建分区示意
图5 分区与逻辑归属变化
图6 分区合并报告
图7 分区综合后资源使用统计
图8 Design partition window
图9 Design partition window
从前面分区的性质和特点可以看出,对包含多个功能模块的多层次复杂设计,可以有许多种设置分区的方案。但需要注意的是:不是任何一种分区方案都能带来编译时间的节约,恶劣的设计分区甚至能够导致编译失败!如何得到高效合理的设计分区呢?我们需要遵从以下原则:
a. 不要创建太多的分区,一般性的设计建议分区的数量控制在4~8个之间;
b. 不要创建太小的分区,一般建议不要小于1000个LE或者ALM;
c. 外设接口逻辑和内核处理逻辑放到不同的设计分区;
d. 相同或相近功能的外设接口,如果管脚位置相邻,可以放在同一个分区,否则创建不同的设计分区;
e. 不同的分区方案中,分区之间的联接少的方案更优。
针对QIC优化代码
除了分区方案,设计代码也对QIC的性能有直接的影响,需要设计者针对QIC做一些特定的代码优化。优化主要有两方面,一方面是升级所使用的Megacore IP到最新的版本;另一方面则是一些更严格的编码规则。
之所以建议升级Megacore IP到最新的版本,这是由于QIC增量式编译常常需要调用Megacore IP的一些特性来支持一些特定操作,而这些特性通常在较新的版本中才能得到比较好的支持,而且随着QIC的成熟不断改进。笔者就曾经在一个尝试使用QIC的项目中,发现客户的设计继承了一部分老项目中的代码,其中包含好几个Quartus 9.1版本的DDR EMIF控制器,占了整个设计使用资源的20%左右。当说服客户把这几个控制器升级到当时最新的Quartus 11版本,发现QIC所能节约的编译时间增加了近1个小时,大约15%的整体编译时间。
之所以QIC要求遵从更严格的编码规则,这是由于Quartus在有分区存在的时候,是不对跨越分区边界的逻辑进行综合优化,一些在Flat compilation中可以被软件优化掉的不良代码,在QIC的流程中会造成严重的影响。这些严格的编码规则包括:
不要在底层分区边界上使用三态信号和双向端口;
Altera器件中,只有在器件的输出管脚上才能实现真正的三态信号,在器件内部,三态驱动是依靠多路器逻辑模拟实现,这两点往往要求跨层的编译优化,而这在增量式编译流程中是做不到的,会导致编译失败。只有一种情形例外,就是内部三态逻辑所涉及的所有信号都在同一个底层分区中,Quartus可以依靠多路器逻辑模拟此三态逻辑。双向端口也类似,只有在此双向逻辑所涉及的所有信号都在一个底层分区中,QIC才能正常进行。
分区的输入输出最好都通过寄存器实现,资源有限的情况下至少保证跨分区的连接中的一端是寄存器(reg-in或者reg-out);
虽然这一规则有一定的实现难度,但它可以避免在使用增量式编译流程的时候,那些跨分区边界的信号的延迟出现大的恶化。如果不能实现这一规则,跨分区连接的两端有可能都是组合逻辑。在Flat Compilation中,这两组组合逻辑会被综合优化到一起来布局布线,时序容易满足;但在是增量式编译中,由于不能跨区优化,这2组组合逻辑的分别布局布线,那穿过这两组逻辑的路径延迟将有可能变得很长,出现时序违背。
避免不包含任何处理逻辑的信号环路穿越分区边界;
也是由于不能跨区优化,这样的信号环在Flat Compilation中可以被优化消除掉,在增量式编译中就不能消除,浪费资源。
避免跨分区的常量信号
类似C,跨区的常量信号不能在目的端分区中直接实现(“0”连接地层,“1”连接电源层),而必须占用走线资源实现。
关注相关报告信息
使用QIC时,Quartus中会产生很多QIC专有的消息,因此在编译报告中也增加一些新的章节。这些报告章节,对我们了解QIC的运行情况有直接的帮助,尤其是当一些异常情况出现,往往需要我们通过阅读这些报告章节来进行调试。比较重要的报告有:
a. Partition Merge report
分区合并的报告章节如下图所示,分别提供在这个阶段网表的使用情况(netlist Types Used),各个分区的综合警告信息(Partition Warning)和综合后各类资源使用情况(Partition Statistics)。
b. Incremental compilation section in Fitter report
在Fitter报告中,也增加了增量式编译的章节。其中,Incremental Compilation Preservation Summary汇总了设计中被保留的布局和布线比例;Incremental Compilation Partition setting 说明了设计中所有分区的创建方式和网表的保留级别(Preservation level);Incremental Compilation Placement Preservation给出了每一个分区中节点保留的信息;Incremental Compilation Routing Preservation则是每个分区中布线保留的信息。
c. Design partition window
这个窗口默认是不在Quartus 界面中显示的,用户需要通过Quartus菜单栏“Assignments”->”Design partition window”打开这个窗口。这个窗口给出可配置分区的当前设置及各个网表文件的时间戳信息,并且可以在此窗口中快速修改分区使用的网表类型(Netlist Type)和Fitter网表的保留级别(Fitter Preservation Level)。
结束语
在本文中,向大家介绍了增量式编译的原理、过程和一些性能表现,同时给出了使用QIC需要注意的一些指导原则。华为、中兴等客户的多个项目实践已经证明QIC是一个可以用来解决大容量FPGA设计编译时间太长的有效手段。增量式编译QIC,值得您去尝试! |