半层次化设计——我们的应对之道


赵继业
中国科学院计算技术研究所

摘要

半层次化设计是一种较为独特的物理设计方法,它结合了EDA界传统的Flatten及Hierarchical设计方法,已经成功应用在龙芯2号处理器的物理设计工作中,取得了较好的效果。本文首先介绍半层次化设计方法的流程,之后分析了使用半层次化设计方法的原因,接着着重介绍流程的重点问题分析,最后总结并展望了半层次化设计方法的应用范围及前景。

1. 介绍

在目前的EDA设计方法领域内主要存在两大设计方法:Flatten设计方法和Hierarchical设计方法,前者主要采用Top-Down方式而后者则主要采用Bottom-up方式。通常的看法是:如果设计对象的时序(或者说是频率)的要求比较高,则尽量采用Flatten设计方法;除非设计对象的规模大到了工具已经无法承受的地步,才会采用Hierarchical设计方法,而且一般说来采用Hierarichical设计方法所得到的效果都会差于Flatten设计方法。因此,各大EDA工具设计厂商,Synopsys、Cadence及Magma、Mentor等,都在不遗余力地提高自己工具的设计规模能力,希望能够尽量满足用户对于(Flatten设计方法条件下)设计规模的需求。

但是,对于我们的设计——龙芯2号高性能通用处理器,我们却反其道而行之,提出了半层次化设计方法,并希望采用这种特别的设计方法能够实现Flatten设计方法所达不到的设计效果。

1.1 什么是半层次化设计

所谓“半层次化设计(Semi-Hierarichical Design)”,实际上就是Flatten设计方法与Hierarichical设计方法的一种结合,从流程上看,半层次化设计流程以布局为分界点可以划分为前后两个阶段:前一个阶段为层次化操作,主要侧重于各个模块的逻辑综合、布局规划及物理综合;后一个阶段采用Flatten方式,完成整个芯片的时钟树及布线等工作。

1.2 半层次化设计的流程

流程示意图如图1所示:

流程的起点是逻辑RTL代码(与物理RTL代码相对应,具体介绍见3.1节),终点则是GDSII文件,也就是说半层次化设计是一个R2G的过程。具体流程如下:

1、完成逻辑RTL代码向物理RTL代码的转换:在物理RTL代码阶段,已经按照顶层Floorplan的要求和考虑将整个设计划分为若干个面积及规模上大致相同的模块了。

2、物理RTL代码的逻辑综合:由各个模块的设计人员分模块完成,各个模块的边界约束则是由设计人员按照处理器的电路结构及可能考虑到的物理位置彼此协商确定。使用工具:Design Compiler。

3、顶层Floorplan的确定:主要是要确定各个模块的位置和大小,主要从芯片体系结构的角度出发考虑顶层Floorplan的规划。各个模块的大小必须结合最终的物理实现确定,因为各个模块的结构不同,从逻辑综合到最终物理实现的面积增长率也不同,最初可以采用统一的单元利用率(Cell Utilization),但随着设计过程的深入,必须对顶层Floorplan进行不断的调整。使用工具及方法:JupiterXT的BlackBox方式。

4、各个模块的布局及物理综合及优化:以各个模块的Floorplan为基础,可以从物理RTL代码开始,也可以从逻辑综合的网表(Netlist)开始,完成各个模块的布局及物理综合和优化。这时使用的模块边界约束与逻辑综合阶段基本一致,随着各个模块布局工作的深入,边界约束也需要不断进行调整,因为最初确定的边界约束并非一定是最佳的。使用工具:Physical Compiler。

5、模块的拼合及整体增量优化:首先将各个模块的布局结果拼合成为一个整芯片,这时候分析时序状况必然存在很多问题,问题的原因可能来自于边界约束、也可能来自一些跨模块的过线。人工确定边界约束最大的缺陷在于无法给定每个模块输入输出端口的驱动情况。但是整芯片的基于布局结果的增量优化可以解决这些时序问题。同时,整芯片增量优化的结果也是半层次化设计的一个重要的分析检查点(Checkpoint),通过对芯片的各个方面的分析:时序、利用率、拥塞度及压降分析等等,可以直接判断是否能够达到设计目标,否则就需要对顶层Floorplan或某些模块的工作进行修正改进。使用工具:Physical Compiler。

6、时钟树生成:在时钟树的设计过程中,我们采用分层方法进行处理。顶层时钟树主干的设计由人工完成,主要目的在于降低时钟树主干的时钟插入延迟、驱动器级数及结合电源规划完成有效的时钟树防护(Shielding)。而各个模块的枝干时钟树则由EDA工具设计完成。我们大量使用了Useful Clock Skew技术,提高了设计频率。使用工具:Astro。

7、布线工作:与通常的布线类似,分为全局布线(Global Route)、布线通道分配(Track Assign)及详细布线(Detail Route)三个阶段,在完成最终布线后,还适当进行了降低线长及布线后优化(Post Route Optimization)的工作,受到了较好的效果。使用工具:Astro。

8、分析及修正:包括信号完整性分析和静态时序分析,采用工具自动修复和人工修复结合的方法。使用工具:Astro+Primetime(-SI)。

9、 LVS、DRC及天线检查。使用工具:Hercules。

2. 为什么会使用半层次化设计方法

具体采用何种设计方法,完全取决于设计环境及约束,作为设计者,必须非常明确设计对象的特点、要求和设计期限,同时也必须了解自身设计队伍的长处和缺点,在综合以上所有因素的条件下,选择最为适合的设计方法,才能尽可能高速高效地完成设计工作。因此,必须以设计为本,重视方法和流程的建立。

之所以提出半层次化设计方法,主要考虑在于设计对象的特点。从龙芯2号处理器的晶体管数量(约2400万)来看,其设计规模并不很大,只能说是中等规模。但其对于时序要求却非常严格,要求在中芯国际(SMIC)0.18um工艺条件下达到500MHz的设计指标。即便是在不考虑任何互连线影响的前提下,逻辑综合阶段关键路径的组合逻辑门级数已经超过了20级,如果按照0.18um工艺条件下一级门延迟约为0.1ns进行估算,已经不能满足2ns的时序要求,更何况要在近6000um×5500um的面积上将这些单元散布开,并且达到最终2ns的时序结果。

在龙芯2号处理器的前两次物理设计工作中,我们使用的都是Flatten设计方法,事实证明无法达到设计目标。在对设计结果分析的过程中,我们发现Flatten设计方法的主要问题在于设计人员对于整个设计的可控程度太低,很难深入到各个模块的细节进行较为有效的设计调整,而对于设计要求很高的设计,如果缺乏设计人员的有效引导,工具很难实现高质量的设计结果。因此我们把目光转向了Hierarchical设计方法。

但经过实验分析,我们发现EDA界传统的Hierarchical设计方法(包括JupiterXT所使用的Virtual-Flatten设计方法)存在着一些缺陷:这些方法往往是在整体逻辑综合和一个粗略布局的基础上进行各个模块的划分,并产生各个模块的边界约束,并依据这些边界约束进行各个模块的物理实现,最后再将各个完成物理实现的模块拼合在一起,完成最终的整个芯片设计。其中最大的问题在于:如何保证在一个粗略布局基础上模块划分的准确性?而这些边界约束的准确性直接影响了各个模块具体物理实现及最终拼合的实际效果。只是在设计对象所要求的时序问题不是非常关键的情况下,这种层次化(Hierarchical)设计方法才能够满足要求的,因此我们认为传统的层次化设计方法更多地是用于解决芯片规模过大的问题,而不是侧重于解决时序方面的问题。

由于我们的物理设计人员能够(且必须)充分了解设计对象(各个模块)的功能及体系结构,并对所面对的设计模块的理想Floorplan及应该出现的关键路径有了较为明确的认识,因此我们不需要使用EDA工具进行模块划分,不需要由EDA工具产生各个模块的边界约束,我们更多地是依靠对设计对象的结构认识来完成边界约束的产生的,与使用EDA工具相比更为准确、可靠,对各个模块的物理实现也更具指导作用。

同时,由于半层次化设计是在布局阶段进行整体拼合,而且拼合后首先完成一次布局基础上的增量优化,因此能够在一定程度上消除各个模块边界约束的不准确性。当然,前提是设计规模必须在所使用的EDA工具的规模范围内,对于Synopsys公司的Physical Compiler、Astro及Primetime(-SI)来说,龙芯2号处理器的规模是完全满足这个条件的。

使用半层次化设计方法的另外一个优点在于:不需要太多(有经验的)物理设计人员的参与。物理设计的特点在于越到后期问题越多越复杂,需要的物理设计人员也越多,经验也要求越丰富。而我们只需要在前段设计阶段考虑到后期的一些重要设计因素,诸如时序一致性,布线的布通率,信号完整性等方面,后期物理设计工作由于是采用整体化(Flatten)设计方式,不需要太多的人员介入,在一定程度上缓解了人员组织的压力。

3. 半层次化设计中的特点及重点分析

不同的设计方法有着不同的流程,在设计的各个阶段也有着不同的要求。具体半层次化设计方法而言,主要考虑以下三个方面的问题。

3.1 模块边界约束的确定

在前面我们提到各个模块的边界约束是由设计人员按照各个模块的电路结构及可能考虑到的物理位置彼此协商确定,主要原因在于不信任EDA工具自动完成的粗略布局结果。那么如何才能较为准确地确定各个模块的边界约束呢?我们采用渐进方式对边界约束进行处理。各个模块的设计人员在对本身模块的体系结构和电路结构详细了解的基础上相互协商,初步确定下模块边界约束,随着设计工作的深入不断加以修正。

这里需要指出的是,边界约束设定的基础并非逻辑综合的结果。随着芯片工艺的不断推进,互连影响在整个芯片中的比重不断加大,因此,各个器件的物理位置对整个芯片的时序结果起着越来越大的作用,仅仅依靠逻辑综合的结果,不结合实际布局进行考虑,必然会给后面的工作以错误的指导。所以边界约束的提出是在各模块完成初步布局工作的基础上完成的,把布局的结果与芯片系统结构中的各种影响因素结合起来系统考虑,再对各个中间层的边界约束进行划分,实际应用中效果很好。随着各个模块布局工作的深入,边界约束也需要不断进行调整,因为最初确定的边界约束并非一定是最佳的。一旦某个模块的设计者发现关键路径出现在模块边界上,就会与相邻模块的设计者进行协商,是否能够通过边界约束的调整将关键路径消除,直到最终两个模块都因为此边界约束而出现关键路径。

人工确定边界约束的问题在于只能较为准确地分配输入输出延迟,而无法准确分配各模块边界的驱动情况,因此我们采用统一的驱动分配,例如输入驱动器假设都是BUFX10,而输出负载假设都是BUFX16。相比输入输出延迟,驱动情况所影响的范围要小得多(只是出现在模块边界),因此一定程度上的简化处理不会太过于影响各模块的设计情况。而且对于半层次化设计,由于存在整体增量优化这一步骤,因此能够较为完美地解决由于边界驱动分配不准确所引起的时序误差。

另一个需要重点考虑的边界约束是各个模块的输入输出信号PIN的分配,由于不信任EDA工具自动完成的粗略布局结果,因而也不会接受EDA工具所自动划分的PIN分配结果,需要人工完成。与输入输出延迟类似,也是考虑到各个模块的电路结构(特别是连接关系)及器件物理位置划分的。一方面需要与时序约束结合考虑,毕竟PIN分配的结果会大大影响模块的设计质量,另一方面则还需要考虑到模块边界的布线拥塞情况,要确保模块边界的布线通畅,因为在整个设计过程中也就是模块的边界部分是最不可控的。由于采用半层次化设计,在进行PIN分配时,可以不考虑具体PIN的精确位置,甚至不考虑信号PIN与电源PIN是否重叠的问题,这可以在一定程度上降低工作量,事实证明,PIN的位置的手动精确调整是一件极为麻烦的事情!

3.2逻辑RTL代码向物理RTL代码的转化

逻辑RTL代码是体系结构的直接反映,能够非常明确地体现结构设计者的意图和设计思路。但是,如果从物理实现的角度考虑,逻辑RTL代码具有模块面积划分不合理、模块间总线扇出过大、模块复用过多等不易实现的缺点,如图2所示。从逻辑层次看,Module A输出信号到Module B、C、D,只需一个PIN,连接一条扇出为3的连线。但是如果在物理布局上,Moudle B、C、D分别在Module A的两侧,如果Module A还是只有一个PIN,连接扇出为3的一条连线,就会出现绕线,如图2中虚线所示。而如果在Module A上再多加一个PIN,就会消除这条绕线,改进原先所不必要的时序。在物理层次,Module A需要2个PIN,其中1个PIN连接一条扇出为2的连线与Module B、C相连,而另一个PIN则连接一条扇出为1的连线与Module D相连。

为了保证最佳的物理实现,就必须对逻辑RTL代码进行转换,生成更利于物理设计的物理RTL代码。这实际上就是一个从逻辑层次(Logic Hierarchy)向物理层次(Physical Hierarchy)转化的过程,在EDA界一直是个热点问题,但由于设计的不同,很难找到一个通用而高效的方法,所以我们采用人工方法实现,从效果上是最佳但需耗费大量较多的人力和时间。

在工具上我们使用Formality+VCS,通过静态的形式验证和动态仿真两个方面保证逻辑RTL与物理RTL的一致性,要求无论在整芯片级别还是模块级别,逻辑RTL与物理RTL均能够进行等价性验证。

3.3 Useful Clock Skew的引入与调整

所谓Useful Clock Skew,就是通过调整各级触发器的时钟延迟(Clock Latency,从时钟起始点到每个触发器时钟输入端口的延迟),来调整前后流水级的路径需求时间(Require Time),以满足尽量小的时钟周期要求。如图3,在三级触发器间存在两级流水级,其中前级流水级延迟为3ns,而后级流水级延迟为4ns,所有触发器的时钟延迟(Clock Latency)为1ns,如果加以3ns的时钟周期就会存在-1ns的Slack,也就是说最小时钟周期应当为4ns。而如果把第二级触发器的时钟延迟降低为0.5ns,则最小时钟周期可以降低到3.5ns。

EDA工具一般是在布局之后布线之前生成时钟树,也只有在这个时候才能考虑到使用Useful Clock Skew。但是由于在逻辑综合及布局阶段使用的还是Zero Clock Skew方式,因此仅仅在布局之后是无法确定需要设定的Useful Clock Skew的正确结果的。在我们的设计中,在逻辑综合阶段就已经考虑到设定相应的Useful Clock Skew,当然具体设置的Skew值并非以逻辑综合的结果为准,而是更多考虑到布局及物理综合的结果。这样才能够暴露真正的关键路径,在优化过程中使关键路径得到充分的重视。

我们使用Synopsys公司的Astro完成Useful Clock Skew的时钟树生成,首先采用ataDefineSyncPin这条命令确定每个需要前提(或后退)的触发器的具体Skew值(相对值),然后按照正常情况生成时钟树(Clock Skew的选项为Global,不需要设定Useful),之后再使用ataPurgeSyncPin命令去除对触发器的设定。

4. 总结和展望

半层次化设计方法是我们第一次突破传统EDA设计流程,根据设计的特点独立开发的特有流程,实践证明,它不但完全适用于龙芯2号处理器,而且大大提高了设计效能。其中既吸收了层次化设计的优势,例如并行性较好、能够深入到各个模块的细节、更好地与单元定制工作结合等等,同时又避免了一些层次化设计的缺陷,例如对于资源(人力及软硬件设备)的过高需求、无法精确控制的边界约束等等。对于设计人员而言,应当根据设计的对象特点选择不同的流程,以达到高效、准确、实用的目的。同时,半层次化设计也为数字IC的高速设计提供了一种可行的方法。流程选择的关键在于对设计本身的充分了解和对于设计过程的精确把握。

同时,在工作中我们也发现了半层次化设计流程的一些缺陷,其中比较突出的是跨模块直连线(Feed Through Nets)问题,有许多互连线是需要横跨一个甚至几个模块的,但是由于我们在生成物理RTL代码及划分顶层Floorplan时没有考虑到这些跨模块直连线,在布局过程中忽视了这些互连线,因而在布线阶段发现了一些由于此类互连线造成的布线拥塞问题,同时这些跨模块直连线也会影响整芯片的时序结果。考虑到这些因素,我们在将来的工作中将进一步开发完全层次化设计流程,希望能够在半层次化设计流程的基础上进一步扬长避短,以实现更高性能的设计。

5. 参考文献

(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® 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 Methodology, S. Posluszny, N. Aoki, D. Boerstler, IBM Austin Research Lab, Austin, TX, DAC 2000, Los Angeles, California.

(6)A 1.3GHz Fifth Generation SPARC64 Microprocessor, Hisashige Ando, Yuuji Yoshida, Aiichiro Inoue, Fujitsu Ltd. Kawasaki, Japan 211-8588, DAC 2003, June 2-6, 2003, Anaheim, California, USA.