查看完整版本: FPGA设计开发软件ISE使用技巧之:增量式设计(Incremental Design)技巧

admin 发表于 2015-4-27 16:40:12

FPGA设计开发软件ISE使用技巧之:增量式设计(Incremental Design)技巧

        6.6增量式设计(Incremental Design)技巧

        本节将对ISE下增量式设计做一个全面的介绍。FPGA作为一种现场可编程逻辑器件,其现场可重编程特性能够提高调试速度。每次硬件工程师可以很方便地改变设计,重新进行综合、实现、布局布线,并对整个设计重新编程。
        然而当设计算法比较复杂时,每一次综合、实现、布局布线需要花很长的时间。即使仅仅改变设计中的一点,也会使综合编译的时间成倍增加。而且更为麻烦的是如果整个工程的运行频率很高,对时序的要求也很严格,这样重新布线往往会造成整个时序错乱。
        运用增量式设计可以有效地解决这一问题。一方面大大节约综合、布局布线的耗时,另一方面可以继承前一设计中已有的成果,是一种比较常用的设计流程。
       
        6.6.1增量式设计的必要性

        增量式设计(Incremental Design)方法是一种能在小范围改动情况下节约综合、实现时间并继承以往设计成果的设计手段。作为一个流程,增量设计能够极大地减小布局布线时间,并且当对一个近似完整的设计作小的变动,可以保持整个系统的性能。
        在增量设计中每一个逻辑分组在Xilinx的FPGA里受到约束以使之只占有自己的空间。在设计中,对当对其中之一的逻辑分组做改动时,一个增量设计流程可以确保未做改动的逻辑分组在进行综合输出时不变化。接着布线工具对改动了的逻辑分组重新进行布局布线,而未改动的逻辑分组则继续以前的布局布线结果,这使得整个设计的布局布线时间得以削减。
        增量式设计对一处复杂的设计来说是非常必要的,主要是因为增量式设计有以下两个方面的优点。
       
        1.减小综合、布局布线的耗时

        当仅对大型设计工程的局部进行改动时,增量设计流程仅仅改动的部分重新编译,如果改动模块的接口设计恰当,将不会影响其余部分的综合与实现结果,布局布线时也只对改动部分重新布线,未改动的部分保持不变,从而节约了整个编译、布局布线与优化的耗时。
        2.能够很好地继承未修改区域的实现成果

        这一点对于对时序要求很严格的设计来说是很有用的。如果一个设计经过多次调试,附加合适的约束,设置恰当的参数达到了最佳实现成果。但是因为对某个细节进行了修改,就需要全部重新综合、布局布线,这样可能前面所做的精心调整工作都无效了。
        通过增量式设计,可以解决这一问题。对于已达到设计要求的部分将其保持不变,仅对修改的部分重新编译、布局布线,从而保证在最大程度上继承以往的实现结果。
       
        6.6.2增量设计流程

        具体的增量设计流程如图6.29所示。
       
        增量设计的流程可归纳如下。
       
        1.创建逻辑分组(Create Logic Group)

        在增量设计中为了实现减小综合、布局布线耗时,极大程度地继承未修改区域的成果,必须要求将设计分成多个逻辑分组。每个逻辑分组应该分配一定的逻辑区域,当某一逻辑分组的内容发生改变时,增量设计可以在该逻辑分组分配的逻辑区域内对其进行重新综合和布局布线,而不会影响到其他的逻辑分组。
       
        所谓“逻辑分组”,是惟一的逻辑层次中的若干逻辑实体的划分。比如在顶层逻辑层次中每个子模块即为一个逻辑分组。在代码中即为顶层中“module(Verilog)”和“entity(VHDL)”定义的子模块的实体。在一个设计中往往将实现的不同功能设置为不同的模块,然后在一个顶层模块中实例化所有这些不同功能的模块,从而实现一个完整的功能,那么这些不同功能的模块就可以看作是不同的逻辑分组。
       
        在进行逻辑分组时,需要考虑以下因素。
        (1)设计中所有逻辑除了IOB和时钟逻辑,都应该包含在逻辑分组当中。
        (2)顶层模块不应该包含复杂逻辑,仅仅包含一些I/O定义、时钟分配逻辑和所有子模块的实例化,直正的功能实体用子模块的逻辑描述。增量设计方法希望将所有的逻辑实体分割到子模块中去,而顶层模块不含任何实际的逻辑功能,以便于做相应的区域约束。
        顶层包含实际逻辑功能的缺点在于:当顶层改变时,相关的Logic Group的接口将发生变化,从而影响Logic Group的结构,在做编译和布局布线时,会影响增量设计的效能。
        (3)逻辑模块分组必须以寄存器输出,即用寄存器分割模块。这一点其实不仅仅是增量设计的需求,也是合理划分模块的一个基本要求。
        如果采用同步时序方式设计电路,用寄存器分割逻辑模块,模块间的接口尽量简单,则时序优化路径集中在同一模块内部而不是模块之间的边界上。这样能够使综合器完整地掌握需要时序优化的路径,从而避免了因一个模块内部改变而通过边界影响到其他模块的时序这种不利于增量设计的情况发生。
        (4)每个逻辑分组为其附加区域分组约束。
       
        2.增量综合(Incremental Synthesis)

        所谓增量综合是指只有改变的部分重新综合,而对未改变部分保持原有的综合结果的一种综合技术。传统的综合技术即使有微小的改动,也会对整个设计重新综合。
        如果要实现增量综合必须对综合工具做相应的设置。在这里主要讲述ISE自带综合工具XST是如何实现增量综合的,对于其他综合工具如:Synplify/Synplify Pro和Leonardo Spectrum综合工具,在这里不做详细介绍。
        XST支持单一工程的模块级增量综合(BLSI)。实现的方法为在XST的约束文件(扩展名为xcf)中附加逻辑分组约束,从而告知XST Logic Group的边界。
        XST在综合时,所有的编译与优化都不超越用户在XCF文件中约定的Logic Group的边界,以达到在细微修改后仅仅对Logic Group内部进行重新综合的目的。这样一个逻辑分组HDL源代码的改变就不会对其他逻辑分组造成影响。
       
        对于VHDL来说,XST可以自动检测出哪一个逻辑分组的内容发生了改变。但对于Verilog来说,必须应用“resynthesize”属性。例如下面就是一个逻辑分组A的Verilog源代码发生细微的改变时的XCF文件范例。
       
        MODEL "top" incremental_synthesis = yes;//对top使能增量设计
        MODEL "A" incremental_synthesis = yes; //对A使能增量设计
        MODEL "B" incremental_synthesis = yes; //对B使能增量设计
        MODEL "C" incremental_synthesis = yes; //对C使能增量设计
        MODEL "top" resynthesize = no; //通知综合工具哪个模块发生改变
        MODEL "A" resynthesize = yes; //no为未改变,yes为已改变
        MODEL "B" resynthesize = no;
        MODEL "C" resynthesize= no;
       
        对于Verilog设计工程,当某一逻辑分组发生改变时,要为其附加相应的综合约束,才能实现增量综合。
       
        另外需要注意的问题是,增量综合是在保留结构层次模式(Keep Hierarchy)下完成的,在进行增量综合时,在“Processes for Source”中选择“Synthesize-XST”,单击右键,设置综合属性如图6.30所示。
       
        如图6.30所示,要完成增量综合,要完成两种设置,选择“Keep Hierarchy”设置为YES或Soft,选择“Synthesis Constraints File”设置综合约束文件的路径。
        增量综合后,需要检查综合报告。
       
        图6.30增量综合属性设置对话框
       
        3.创建区域分组约束

        创建区域分组约束是增量设计中最重要的一步。区域分组约束做得不好会增加综合、布局布线耗时,甚至有可能导致布局布线无法完成。区域分组约束的创建是利用ISE下的PACE工具,在PACE下完成区域分组约束后,ISE会自动将其写入UCF文件中。
       
        为增量设计创建合理的区域分组约束要遵循以下原则。
        ·所有I/O引脚位置必须锁定。
        ·将与I/O端口联系密切的区域分组布置在相应I/O端口的附近。
        ·区域分组约束的范围不应该重叠。
        ·尽量保证每个区域的资源利用率基本一致,避免出现某一区域利用率达到99%,而另一区域的利用率只有10%的情况。
       
        ·如果一个区域分组中包含FPGA的多种资源,如:Slice、Block RAM、TBUF、Multipliers等,这时很有必要将不同的资源设置在不同的区域,然后将几个不同位置区域拼合为一个区域分组。可以使用PACE、Floorplanner等工具完成,也可以在约束文件中使用如下约束:
       
        INST Logic_Group_A AREA_GROUP = AG_Logic_Group_A ; //AREA分组
        AREA_GROUP "AG_Logic_Group_A" RANGE = SLICE_X0Y20:SLICE_X20Y30 ;//SLICE约束
        AREA_GROUP "AG_Logic_Group_A" RANGE = RAMB16_X0Y2:RAMB16_X0Y2 ;//RAM约束
        AREA_GROUP "AG_Logic_Group_A" RANGE = MULT18X18_X0Y1:MULT18X18_X0Y1;//MULT约束
        AREA_GROUP "AG_Logic_Group_A" RANGE = TBUF_X0Y0:TBUF_X1Y0;//TBUF约束
       
        4.增量实现(Incremental Implement)

        第3步的创建区域分组约束也可以作为增量实现的内容,增量实现的步骤如下。
        (1)设置区域分组约束。
        (2)映射、布局布线得到初始指引文件。
        (3)下载调试,需要修改时,对细微细节进行修改,然后实现增量综合。
        (4)增量综合后在初始指引文件下进行第二次映射与布局布线。
        (5)下载调试,如仍有问题,重复步骤(3)~步骤(5),直到符合设计要求为止。
       
        在增量实现过程中,必须要对布局布线的属性进行相关的设置。首先应该使能增量设计,具体设置如图6.31所示。在“Processes for Source”中选择“Implement Design”,单击右键,出现属性对话框。选择“Incremental Design Properties”,然后选择“Enable Incremental Design Flow”,使能增量设计。
       
       
        图6.31项目管理器中启动增量设计功能对话框
        在增量设计中,如果是用Synplify/Synplify Pro等第三方综合工具,那么需要由综合工具生成向导文件指导实现工具进行实现流程。选择如图6.31中的“Run Guided Incremental Design Flow”选项,表示将由指定的向导文件来指导实现工具进行实现流程。
       
        向导文件可提供Map.ncd文件和Par.ncd文件。其中,Map.ncd文件包含了slices、IOBs等映射信息。Par.ncd文件包含了布局和布线信息。实现工具根据这两个文件的信息来确定没有改变的模块和已经改变的模块,把没有改变的模块放进向导文件所记录的上次综合实现的位置。对布线器来说,该布线资源同时也将被保留,其布线关系也不会改变。
       
        使用向导文件,要对实现具的属性做部分修改。将“Map Guide Mode”和“PAR Guide Mode”分别改成增量型(Incremental),如图6.32和图6.33所示。
       
        图6.32使用指引文件指引映射图6.33使用指引文件引导布局布线
       
        进行了上述设置后,需要指定映射和布局布线的指引文件。
        整个增量实现步骤完成后,需要检查映射报告(扩展名为map)和布局布线报告(扩展名为par),看是否真的完成了增量设计。
       
        6.6.3小结

        本节对增量式设计方法的概念以及设计流程做了全面的介绍,希望读者能够掌握增量设计的基本流程,并应用到自己的工程设计当中。在6.9节中会通过一个具体的实例来说明增量设计的整个流程。
       
        增量设计在大型的工程设计中是很有用的,可以为设计节约大量的时间。增量设计中一个难点在于分组区域约束的设置,这不但需要对整个工程有全面的把握而且要求对于FPGA器件的内部结构有一定的了解,这需要在实践中不断积累经验。
页: [1]
查看完整版本: FPGA设计开发软件ISE使用技巧之:增量式设计(Incremental Design)技巧