QUARTUS II 增量编译

在开发阶段,经常需要改代码,而且往往只改局部代码,但是编译的时候,通常会全部重新编译,这会很浪费时间,使得开发效率大大降低。那么有没有一种方法能够降低不必要的编译时间呢?通过查询Quartus II Handbook Version 9.1 Volume 1: Design and Synthesis手册,找到了方法,那就是采用incremental compilation方式。其实这种想法就是将已有编绎的成果保持不变,因此需要将整个设计进行模块化,如果整个设计就是相互耦合,水乳交融,那么好像用这种方法估计是行不通了。

在这里野蜜蜂做了一个sigma delta调制工程(软件为Quartus II 8.0),其主要模块包括正弦波发生器(用了查询表),插值,SDM调制等,模块的设计细节不在这里阐述。首先看一下第一次编译所花的时间如下:

QUARTUS II 增量编译

如果此时改变了正弦波发生器的一个参数,其它模块都没变,如果没有做任何设置,还是按原来的方式编译(保持整个系统的运行环境基本一样),则所花的时间如下:

QUARTUS II 增量编译

比较两幅图可以看出,时间几乎花的一样,没有改进,编译器很’傻’,至少从人的角度来说,只需要重新编译一下正弦模块就可以了,其它都可以保持不变,这样的话工作量就少多了。下面采用两种方法来改进一下这种悲剧。

(1)、第一种方式很简单,设置一下参数,让编译自己决定到底哪些需要重新进行编译,哪些不需要。

点击菜单栏上的”Assignments”,选中其中的”Settings”选项。如下图所示:

QUARTUS II 增量编译

从跳出的对话框中选择左侧的”Compilation Process Settings,”,然后将右侧的”Use smart compilation”打钩选上。如下图所示

QUARTUS II 增量编译

再点击左侧的”Compilation Process Settings”下的”Incremental Compilation”,将右侧的“Full incremental compilation”选上。如下图所示。将这两项选上表明可以让编译器根据之前编译产生的数据库自动识别哪些是改过,哪些是没改过的,从而做出编译选择,哪些需要,哪些不需要。

QUARTUS II 增量编译

下面看一下在此种方式下的时间:

QUARTUS II 增量编译

跟前面相比,主要是在“Analysis & Synthesis”上将时间花少了,但布线时仍然花那么多时间,这说明他在布线上仍然做了全局优化。但如果之前的编译已经在功能和时序上都已经满足了,对模块也只需要做小小的修改,那么其它模块的布线什么之类的也应该不用变化了,直接采用原来的就可以,但是编译器从全局上仍然做了得重新布线。下面考虑第二种方法:

(2) 采用Partition的方式,即手工设置模块,告诉编译器哪些需要改,哪些不需要改。下面是具体步骤:

一、局部更改代码,或者改正Bug。

二、自己手动设置Partition,即相当于分模块。在”Project Navigator”里”Hierarchy”标签下,可以看到各个层次的模块(因为之前已经编译过了)。右击某一个模块选择“Set as Design Partition”,其它模块同样设置,见下面二图。

QUARTUS II 增量编译
QUARTUS II 增量编译

三、选择保留的程度,即没有改变的是选择综合的(Synthesis),还是映射后(Fitter)的数据。点击菜单栏上的”Assignments”,选中其中的”Design Partitions Window”选项,出现Partitions窗口,如下图如示。从图中可以看出,之前所有分的Partitions都在里面。

QUARTUS II 增量编译
QUARTUS II 增量编译

在上图中’Netlist Type’下面全部选成’Post-Fit’选项,因为我们要选择映射后的数据。除了’sine:inst2’模块和’Top’模块,选择’Source File’,因为’sine:inst2’是代码进行改变的,因此需要从source file重新编译,而sine模块会影响Top,因此Top也选择source file。

在Fitter Preservation Level列下,全部选择’Placement and Routing’,我们保留不仅是映射后的逻辑,之间的连线也一同保留,这样对于不改的模块就等于什么都不变了。

四、重新进行编译。

QUARTUS II 增量编译

从图中可以看出,要比最原始降了将近一半左右。‘Synthesis’和’Fitter’都只花了原来一半时间左右。可以看出时间明显缩短了。

从上面可以看出,在后期采用这种方式可以有效的缩短编译时间,但是他也有一个缺点。即在修改之前,时序已经得到满足,而且也是小规模的修改。如果之前时序还未满足,这种方法就可能不合适了,因为时序问题不一定出在这个模块上,因此需要其它流程来进行处理。

当然上面只是从手册读下来的个人观点:即这种修改只适合已经满足功能和时序,只是再进行小规模的修改而已,如果其它的估计还得要从其它方面着手吧。