关键词 层次化设计;收敛性;模块布局;时钟优化;延时分配;大型设计
如今一般的后端设计是采用把网表打散,把所有的逻辑单元看作是一个层次上,层次关系不用考虑,一起进行设计,优化。这样设计的好处是逻辑关系比较简单,在做优化的时候,可以对逻辑单元直接处理,所有的物理单元都是可见的。但是,随着现在设计越来越复杂,单元越来越多,现在的单层次的EDA工具的承载能力遭到了挑战。由于设计的庞大,使得后端设计所花费的时间越来越长,于是出现了层次化设计流程。
层次化设计流程是指把设计对象分成多个模块分层次设计,在设计的过程中,要考虑层次之间的关系,顶层模块和底层模块的关系,层次内部的优化等等。最终,在各个模块达到其各自设计要求的同时,满足顶层的设计要求。
(1)大多数原因是设计规模的庞大。很大的一个设计就需要考虑层次化。
(2)层次化设计可以给一个模块里的设计单元一些约束,使他们可以在一个区域内布局布线。这种约束性给某些特殊的设计带来方便,比如说:多电压设计。随着现在对低功耗的要求越来越广泛,设计者一般会对不同的模块进行低功耗的考虑。不同模块会有不同的供电电压。这样,层次化设计可以对这些不同的模块单独进行功耗分析和设计。
(3)层次化设计有时候也是应项目进行的情况可以采取的一个方法。一般来说,一个大型的设计会分几个小组分别设计几个模块。几个模块的进度有可能不一样。后端设计一般不会等到所有的模块完成了以后才进行。一般来说,可以对部分没有完成的模块估计一个大小,时序。然后把这些模块当作是Black Box(黑盒)放到顶层进行后端设计。这时候,我们采取的也是层次化设计。
(4)层次化设计也是一种设计流程的选择。一个模块的单元如果约束在一起,其内部的优化可以更方便。芯片的各个模块能有效地控制单元固有的离散性,从而最大限度地减少时序或拥塞的变化。
(1)由于有层次化的划分,模块之间及与顶层的关系是不透明的。和平面设计不同,顶层的优化不能进入到模块内部,这样,有可能造成优化的限制。
(2)层次化设计对逻辑的要求比较严格,改变逻辑的时候要注意对层次化的影响。比如,如果在布线的时候,需要穿越某些模块,那需要在这些模块中新增加逻辑连线。所以,逻辑的更新要和布局布线同步。
(3)层次化设计中,模块内部优化所需要的约束条件是通过在顶层的分析中得到的,而顶层的分析又是基于模块内部的情况得出的。所以,这是个反复的过程。层次化设计要注意反复优化时应该遵循收敛原则。最后的结果应该是顶层的时序得到满足,模块的时序也得到满足。
(1)层次化分块。在读入的网表文件中,前端的设计者会按照功能创建一些模块。在层次化设计中的初始,就要对这些模块进行分析,有些模块需要打散并入到顶层,有些大的模块需要保留,当作一个子module进行分层处理。
(2)层次化放置单元。把子模块里的单元集中放在子模块里。
(3)如果timing有问题,做一下简单的优化,比如说修复一些DRC的violation(cap,transition,fanout),插入/删除/更换一些缓存器。
(4)Power的处理。power会采取网格状的模式,同时会做power的分析,做完之后preroute (preroute指对电源线的连接)可以先不要做。
(5)时钟的规划。现在工具已经可以提供一种由下而上的时钟规划。利用工具提供的方法做完时钟规划后,可以得到一个初步的时钟优化,同时会得到一个优化的结果,就是指顶层的时钟的skew能被优化到什么结果,底层的时钟优化的目标是是么。当然这个只是初步得到的结果,可以做个参考。如果得到的skew很差,那就需要重新考虑模块的布局了。
(6)模块化的布线。接下来就可以为产生接口的位置及产生的子模快做准备了。接口的位置是通过布线来得到的。工具会对整个设计进行布线,这样的布线是指global route。 子模块内部的布线是首要考虑的,接下来是接口的布线,最后是顶层的布线。而端口的位置就是通过接口的连线在子模快边界的交点的位置产生的。由于是global 的route,交点不是在wire track上,所以,最后接口的实际位置将会稍微偏离global route。
(7)把模块变成软模块并且产生接口位置,同时把电源线复制到底层。
(8)为模块产生时序的模型。由于软模块内部的信息顶层是看不到的,所有要通过ilm(记录了子模块接口的时序信息的模型)把内部的时序信息映射到顶层去。这样在顶层做时序分析的时候就能包含整个设计的了。
(9)延时分配。这是很关键的一步。时序预估是通过时序分析,产生底层的时序约束,把顶层和底层的优化的目标分配好。通过实际的每个模块的及其顶层的延时,得到各自模块在整个延时所占的比重,然后按照要求的时钟延时(require delay) 进行分配。然后把得出的延时作为时序约束传给子模块。
(10)有了子模块的时序约束,分别打开子模块进行布局,优化,布线。
(11)子模快优化成功之后,转换成硬模块。这样,底层将不会再被改动任何信息,最后,回到顶层做顶层的优化。
这里要注意的是,如果子模块不能达到优化的结果,需要回到顶层,进行顶层的优化,这样可以对底层的优化约束会降低,然后,再产生底层的约束,再做底层的优化。这应该是个收敛的过程。最后的结果会越来越好。
4 层次化设计中哪些步骤需要注意得到收敛性的时序
用来做层次化设计的子模块一般是网表里的单元器件比较多的模块,并且与其他模块连接关系较少的模块。原因是:由于子模块在布局布线的时候会集中在一个区域,如果这个模块和外界联系比较多的化,这种集中会使得其距离外界单元比较远,不如打散的效果好。如果有很多时序存在这个模块和外界之间,会造成整个设计的时序比较差。
在我们没有划分模块之前,我们对全局进行布局,发现模块b和模块c2内部连接很集中,而c1模块内部的单元被分散在芯片的四周,说明它与其他很多模块有连接关系,外部连接关系比内部连接关系更多。这种情况,我们一般选择把b和c2作为层次化设计的子模块,这样有利于在后期能一直很好的保持设计的收敛性。
在产生子模块之后,我们可以利用工具对芯片进行布局。工具会按照层次化的原则进行布局,即属于同一模块的会放置在同一范围内。这时,我们需要给子模块产生一个形状并且给它一个位置。模块的位置最好放置在内部单元集中放置的中心,之后,当我们把属于这个模块的所有单元都放置到模块中时,我们所得到的结果将与初始的结果相匹配。
层次化设计的后期是把顶层和底层分割开来处理,所以,它们彼此的信息交流都是通过接口来进行的,而接口的物理位置是通过布线产生的。布线时,为了保证逻辑的与物理的一致性,需要遵循以下的原则:①内部的连接需要在内部完成布线。②逻辑上模块有多少接口,在布线的时候穿过这个模块的次数就有多少。但是,原则2给层次化设计带来了局限性,如果遵循了这样的原则,将迫使布线需要饶过一些模块。为了打破这种局限性,我们允许改变模块的逻辑,在边界产生额外的接口,这也是为了达到布线的最优。如图1介绍了几种产生feedthrough pin(额外穿越边界的接口)的情况。
由布线产生接口的流程是:先对模块内部进行布线,然后对接口的连接进行布线,最后是顶层的连接进行布线。这样做的优点是我们在前期就能预估到整个设计是不是能完成布线。如果只是对接口进行布线的话,很有可能接口的位置不好从而影响了内部的布线。而接口的位置一旦决定下来,修改起来就难了。所以,我们在产生接口之前就考虑好模块内部的布线,这样能保证后期的结果也是可行的。有一种情况在布线的时候要特别注意,对于相贴边的模块,在贴边处不要放置单独的接口。这样的接口会导致顶层的布线无法通过模块与外界相连。因为层次化设计的后期就是把模块做成硬模块,底层顶层分别进行详细的布线,优化。彼此独立。所以,在顶层,将会把底层的模块全部屏蔽,布线将不允许穿过子模块。这样,图示中的接口在布线中会遇到很大的困难。所以,即使有与外界没有连接关系的接口,我们也不要把它们放到贴边的位置,因为很有可能在ECO的阶段,设计者会为这些端口加上连接关系。在贴边处的端口永远都要遵循一一对应的关系。
在一般时钟优化中,我们主要考虑的是Useful Clock Skew。 所谓Useful Clock Skew,就是通过调整各级触发器的时钟延迟(Clock Latency,从时钟起始点到每个触发器时钟输入端口的延迟),来调整前后流水级的路径需求时间(Require Time),以满足尽量小的时钟周期要求。所以一般我们对时钟skew的优化的目标是所有的sink端口的时钟延时尽量保持一致,这样时钟对时序的影响能降低到最小,使我们在逻辑综合和布局阶段的分析大致准确。在平面设计中,所有的sink端口由上而下进行平衡其延时。先把所有的sink端口进行分组,按照就近原则,按照电容的一个阈值进行合并成组,在同组的sink端上层插入缓存器,然后,以缓存器为sink端口,按照同样的原则再往上层插入缓存器,一层一层往上递推,建立时钟树。
如此建立的时钟树能保证所有的sink端口是比较平衡的。当然在选择组的时候会考虑一些其他的因素,比如gated clock,generated clock,hard macro的时钟端口。如果仅靠分组的情况不能平衡,比如有些组离时钟端口的距离差别很大,还需要对各个不同的组插入不同的缓存器。
接口的物理信息产生以后,最重要的将是产生每个模块的时序约束。顶层的时序约束是由前端综合的结果及设计者的要求提出的,但是子模块的时序是在顶层对整个设计的时序分析后产生的。通过整个设计的层次化分析,主要把延时在各个模块内部进行分配,把优化的指标分配到每个模块中。延时分配在层次化设计中是很重要的方案,目的是通过各个模块的努力使整个设计的时序达到要求。它的大致原理是先得到通过模块端口的最差路径,得到这条路径在每个模块及顶层的延时,然后用require time(时序如果达到要求需要的延时)减去顶层的延时(因为我们在分配的时候假设顶层的延时是不变的,也就是我们不把顶层的优化考虑进去)乘以本模块延时占整个模块延时的比例。时序分配之后,再把分配后的延时作为接口的输入延时和输出延时。分配之后的延时使得各个模块内部看到整个路径的延时变小,也就是其他模块为他分担了一部分优化的难度,分担多少要看它自身本来有多少延时。各个模块按照分配后的结果进行优化之后,如果每个模块的时序都达到要求,那么整个芯片的时序将达到要求。
实验目标:通过层次化设计实现时序收敛。
实验对象:实例中的design大小为中等design,90k左右标准单元,顶层包含9个模块。根据模块大小,选取了其中三个作为层次化设计的子模块。
(1)先进行模块分割及模块放置,然后把模块内部的单元放置在模块内部,这是层次化设计的基础,开始进行层次化设计,同时,评估一下布线及时序优化的可行性。
如图1如果按照扁平化布局,左边的布局,根据子模块的布局可以看出,子模块内部的单元模块的放置比较集中,于是,我们按照子模块的扁平布局得到了子模块的边界大小及位置。然后,有了边界的约束,产生了新的层次化的布局,如图3所示。
一般来说,Congestion 的GRC在0.5%以内,Max在5以内是可以布线成功的。时序在时钟周期的20%以内是可以得到最后的优化的。
(2)时钟优化。利用层次化时钟优化的方法进行优化,可以对时钟进行层次化处理,每个子模块的时钟会先得到优化,然后传递到顶层。如图4所示。
(3)进行层次化布线,之后根据层次化布线产生接口。在做层次化布线时,我们看到允许产生feedthrough可以得到更好的布线长度和更小的拥挤度。如图5所示,比较了允许产生feedthrough和不产生feedthrough的数据对比。从图5中可以看到,产生feedthrough了以后,顶层的逻辑连线穿过了子模块,得到了更优的布线。
(4)接口产生,我们再对模块产生时序模型,使得在顶层也可以看到底层的电容电阻信息,在时序分析时,可以得到和接口有关的时序结果。由于接口的位置和布线稍微有些偏差,我们得到的时序分析和在层次化布线时得到的时序分析有点出入:
Timing report:Max Slack:-0.45 Total Slack:-18.81
(5)进行延时分配。然后分别在底层进行优化,布线。我们得到的完全可以布线及优化的结果:
模块1:Wirelength:3482179 DRC Violation=0 Max Slack = 0.02
模块2:Wirelength:1127638 DRC Violation=0 Max Slack = 0.43
模块3:Wirelength:2114073 DRC Violation=0 Max Slack = 0.43
顶 层:Wirelength:4313672 DRC Violation=0 Max Slack = 0.53
与层次化布线后的结果相比较,结果是有收敛性的。
层次化设计的收敛性是建立在整体的把握上。从模块的分割到延时分配,每个环节都要做好分析和检查,模块的集中性需要保证,顶层和底层的信息传递要准确,接口的位置要和层次化布线保持基本一致,延时的分配要合理等等这些因素都会影响到层次化设计的收敛性。在这次实践过程中,对每个环节的分析都比较全面,于是得到了比较好的结果。层次化设计中最需注意的是如何保证在前期对整体的分析在后期层次分离之后是有效的,使得整个设计的优化是收敛的,文中所提到的四个方面是一些方法,更多的方法要在更多的实践中得到。层次化设计是大型设计不可避免需要掌握的。
[1]Physical Hierarchy Generation with Routing Congestion Control,Chin-Chih Chang,Jason Cong,Zhigang(David) Pan,and Xin Yuan,ISPD'02,April 7-10,2002,San Diego,California,USA
[2]A 1.5GHz Third Generation Itanium(r) 2 Processor,Jason Stinson and Stefan Rusu,Intel Corporation,DAC 2003,June 2-6,2003,Anaheim,California,USA
[3] A 480-MHz RISC Micro- processor in a 0.12um Leff CMOS Technology with Copper Interconnects,Chekib Akrout,John Bialas,Miles Canada,IEEE JOURNAL OF SOLID- STATE CIRCUITS,VOL. 33,NO. 11,NOVEMBER 1998
[4]Deep-submicron Design Challenges for a Dual-core 64b UltraSPARC Microprocessor Implementation,Toshinari Takayanagi,Jinuk Luke Shin,Sun Microsystems,Inc. 2004 IEEE International Conference on Integrated Circuit Design and Technology
[5]“Timing Closure by Design," A High Frequency Microprocessor Design Methodol