2.3 布局

布局(place)阶段主要根据布图及电源规划进行模块约束规划,设置有用时钟偏差,制定latch的放置区域,同时制定不可修改单元(don't touch cell)和不可使用单元(don't use cell),然后进行布局。布局后,进行时序分析并考量标准单元的图形密度。

2.3.1 模块约束类型

常见的模块约束定义了控制模块的位置摆放的约束。类型包括模块指导约束(guide)、模块区域约束(region)、模块栅栏约束(fence)三种。guide指导相关模块进行位置摆放,是一种软约束,相关模块的标准单元尽量放在指定的区域内,也可以根据连接关系放在区域的外面,同时其他模块的标准单元也可以放在该区域内,如图2-13(a)所示。region是一种强约束,相关模块的标准单元必须放在指定的区域内,同时其他模块的标准单元也可以放在该区域内,如图2-13(b)所示。fence是一种硬约束,相关模块的标准单元必须放在指定的区域内,同时其他模块的标准单元不可以放在该区域内,如图2-13(c)所示。

图2-13 guide、region、fence的区别

2.3.2 拥塞

拥塞表征了在绕线前预估的连线的紧密程度及可实现性。较大的拥塞会导致在绕线阶段,无法完成绕线或形成最为致密的连线,增加了线与线之间的耦合电容,进而增加了连线的延时,造成时序违例。

对于部分低功耗单元的第二电源端口通常在绕线阶段完成,如常开缓冲器的第二电源端口。这是由于这些单元依赖于与其相连的标准单元的位置,需要在布局阶段才能确定位置。其所连接的第二电源会在绕线阶段根据绕线通道和最近的电源网络相连接。

1.拥塞的表征

拥塞在物理设计过程中通常使用拥塞标记来表征,如图2-14所示。在实际布线中多采用水平或竖直方向走向,因此根据方向的不同,拥塞分为水平拥塞和竖直拥塞,分别用HV表示。其中,拥塞的程度用不同的颜色表示。每个单位区域包含了10个全局单元。图2-14中上面的单位区域的竖直拥塞程度为1级拥塞,即该区域可供走线的轨道数量为50,而实际中需要有51条绕线从这里通过,进而形成了拥塞。下面的单位区域的竖直拥塞程度更为严重,需要额外的2条轨道才能满足要求。将整个版图划分为多个单位区域,计算每个单位区域的拥塞程度,最终形成了整个版图的拥塞分布,可以较为直观地反映出局部拥塞的程度,如图2-15所示。

图2-14 拥塞标记

图2-15 版图中的拥塞状况

2.拥塞的解决办法

拥塞的出现和布图、布局有较为直接的关系。因此在布图和电源规划的阶段,就需要考虑拥塞。在引脚位置指定时引入拥塞的计算,是因为引脚的位置决定了整个芯片或模块的数据流向。错误的引脚摆放,往往会导致输入信号和输出信号在某一区域形成大幅重叠,形成严重的拥塞。在布图阶段中解决拥塞的办法是控制该区域及邻近区域的标准单元的密度,从而降低通过该区域的绕线数量。另外,对于时序约束易满足的绕线,可以通过添加引导缓冲器(guide buffer)来控制这些绕线的走向,尽量避开拥塞较为严重的通道。

2.3.3 图形密度

标准单元的图形密度和绕线的拥塞程度直接相关。较高的标准单元图形密度往往会导致绕线拥塞,进而使得时序难以收敛。较低的图形密度使得芯片的利用率较低,从而增加了芯片的成本。同时,图形密度和所采用的标准单元库的端口密度有关,较高的端口密度需要对应较低的图形密度,为端口访问预留充足的空间。因此,需要在绕线拥塞和利用率之间做折中考虑,业界常用的图形密度为60%~80%。标准单元的图形密度的计算公式为

如图2-16所示,标准单元总面积为5个标准单元模块的面积之和,芯片内部面积为除端口外的内部矩形的面积,硬核面积为SRAM和IP的面积之和,空洞面积为图中右斜线矩形的面积之和。

图2-16 标准单元分布及图形密度计算

2.3.4 库交换格式优化

在布局阶段,标准单元根据数据流向、时序约束、模块的物理位置约束、功耗约束进行摆放。一般情况下,标准单元在发布之后,标准单元内部不存在设计规则违例的情况。然而,在软件完成自动布局后的标准单元之间存在设计违例的可能性,主要来自两方面:一方面是代工厂发布标准单元没有充分考虑标准单元的任意组合:另一方面是在电路物理设计中需要对标准单元的库交换格式(library exchange format,LEF)进行修改。当两个标准单元被放置在相邻的位置上时就会导致这两个标准单元内部的某层出现设计违例,如图2-17所示的第一个金属层。

对于这种违例的解决办法是,在相应的标准单元的一侧添加最小的填充单元,使得出现在设计中的该类标准单元全部被有效隔离,避免设计违例的出现,如图2-18所示。

图2-17 标准单元之间的内部金属层出现设计违例

图2-18 添加填充单元后有效避免了设计违例的发生

2.3.5 锁存器的位置分布

通常情况下,和SRAM相关的数据路径中会包含锁存器(latch)用于锁存数据。默认无约束时,latch通常会由工具自动摆放,如图2-19(a)所示,这种情况下的摆放容易产生较多的拥塞,不利于后期的绕线,产生时序上的违例。此时就需要人工干预,通常会通过写脚本的办法,根据SRAM和latch连接的端口的位置,将latch吸附在对应的端口附近,如图2-19(b)所示,这样保证了数据路径在物理连线上不会出现相互交叉的情况,减少了拥塞。

图2-19 和SRAM相关的latch

另一种解决办法是增加相应连线的权重。对于权重较大的连线,在布局时会着重考虑该连线上所连接的标准单元之间的距离,进而达到拉近单元之间的距离或单元与端口之间距离的目的。

2.3.6 有用时钟偏差的使用

时钟树延迟(latency)是指从时钟信号输入端到寄存器、SRAM和IP的时钟信号输入端的时间。在布局阶段,时钟树通常被认为是理想情况,即所有时钟树延迟相同,为实际时钟树的预估延迟,如图2-20所示。然而,在SRAM中通常已经完成内部时钟信号的布线,从SRAM的时钟信号输入端到内部单元时钟信号接收端已经存在一个固定的延迟。这就意味着,从顶层时钟信号输入端到SRAM内部单元时钟信号接收端的延迟要大于从顶层时钟信号输入端到寄存器时钟信号接收端的延迟。进而导致从寄存器到SRAM的数据路径延时小于时钟周期与时钟偏差(此时为正)的和;而从SRAM到寄存器的数据路径延时大于时钟周期与时钟偏差(此时为负)的和,造成建立时间的违例。为了解决这一问题,需要给出SRAM内部时钟树的延迟,该延迟即为有用时钟偏差。在理想情况下,时钟信号先到达SRAM的时钟信号输入端,然后沿着内部时钟树到达内部时钟信号接收端,随着时钟信号到达SRAM内部接收端,时钟信号同时到达了所有寄存器的信号接收端,从而保证了从寄存器到SRAM及从SRAM到寄存器的数据路径同时满足时序要求。

图2-20 SRAM中的有用时钟偏差

同样,在普通的寄存器中也存在有用时钟偏差的情况。只是这种情况不是由寄存器内部时钟树延迟引起的(普通寄存器内部的时钟信号绕线很短,所有寄存器的内部时钟信号的延迟可以视为相等),而是由于不同模块位置不同导致了寄存器之间的数据路径长短不一致。如图2-21中,寄存器1和寄存器2由于模块(module)位置相距较远,因此需要加入更多的缓存器来控制数据信号的上升及下降时间,使得从寄存器1的Q端到寄存器2的D端的数据路径延时大于一个信号周期。同时因为寄存器2和寄存器3的物理位置相距较近,需要的缓冲器较少,因此从寄存器2的Q端到寄存器3的D端的数据路径延迟时间(延时)小于一个信号周期。此时,可以把寄存器2的时钟信号延迟加长,使得从寄存器1的Q端到寄存器2的D端的数据路径和从寄存器2的Q端到寄存器3的D端的数据路径同时满足时序要求。其中,寄存器2的时钟信号延迟加长的部分即为有用时钟偏差。

图2-21 普通寄存器中的有用时钟偏差