在数字集成电路设计中,时钟信号是数据传输的基准,它对于同步数字系统的功能、性能和稳定性起决定性作用,所以时钟信号的特性及其分配网络尤被人们关注。时钟信号通常是整个芯片中有最大扇出、通过最长距离、以最高速度运行的信号。时钟信号必须保证在最差的条件下,关键的时序要求能得到满足,否则对时钟信号任何不当的控制都可能导致紊乱情况,将错误的数据信号锁存到寄存器,从而导致系统功能的错误。
在现有基于标准单元的ASIC流程中,通常将扇出较大的时钟网络在综合阶段设置为理想时钟,在物理设计阶段进行时钟树综合,因此它是后端物理设计的关键步骤之一。
一、时钟树综合方法
芯片设计中的时钟分为两类:真实时钟(real clock)和虚拟时钟(virtual clock)。真实时钟又有两种模式,时钟树综合前没有延时的理想时钟(ideal dock)和时钟树综合后的传播时钟(propagated clock)。在设计中有时需要定义相对于系统的参考时钟,例如,对于某个不含PLL的设计模块,其时钟信号来自顶层芯片时,我们就定义它为虚拟时钟。虚拟时钟没有源头,它在整个系统设计中存在,在当前设计中不存在。时钟树综合时必须先定义虚拟时钟,然后才能定义并约束端口的输入输出延迟。
简单的说,设置virtual clock的好处就是可以在不影响real clock的情况下,指定clock的clock network delay。
我们知道,clock latency包括了clock source latency和clock network delay。当BLOCK中没有做clock tree 的时候,clock network delay 等于0, 这时候,RegA到PORT这个path来说,用virtual clock还是用real clock, 效果都是一样的。
但是,当BLOCK到了CTS阶段后,因为有BLOCK内部有clock network delay的存在,而RegB仅仅是个虚拟的寄存器,他的clock tree是不存在的,因此,clock network delay也就是0,这就会导致 RegA 到 PORT的timing path变得过于严格(与之相反,input 到 内部寄存器的path的setup check就会过于乐观)。那么我们可以对RegB设source latency。然而不幸的是,如果用的是real clock, 那么必然会导致RegA的clock的source latency也相应的改变。这时候就体现出了virtual clock的作用。
虚拟时钟在设计中的实际应用是用于作为输入输出端口延时约束的时钟源。EDA工具会基于虚拟时钟,根据芯片/模块内部时钟的实际 delay评估IO外部假定寄存器的propagation time,这样时序分析就可以规避不必要的“假”违例。
理想时钟开始用于逻辑综合阶段,通过设定一些参数模拟真实时钟。在芯片布局完成后,需要对理想时钟进行延时计算从而建立时钟树,这时,便设定时钟的属性为传播时钟,这样,时序工具在分析时,就会考虑时钟树的门延迟和线延迟。
1、设计约束
时钟树综合(CTS,clock tree synthesis)时需要对期望实现的参数做出定义,这些参数通过“时钟树约束文件”来提供。时钟树所用的约束文件中首先是对时钟信号本身的定义,它们直接来源于标准设计约束SDC文件。SDC文件为设计约束的标准,它的主要内容包括时序约束(timing constraints),因此它也常常被称为时序约束文件。
标准设计约束SDC文件是规定到达同步寄存器的数据与时钟之间满足设计要求的一种时序关系。SDC文件主要有三部分组成:时钟定义、输入延迟、输出延迟。在顶层设计中,还需要约束输入端口的驱动以及输出端口的负载等信息。对于多时钟的复杂SoC设计,还需要根据设计的具体情况设定多周期检查路径、冗余的伪路径以及最大延迟时间和最小延迟时间等约束,如下表:
与时钟信号延滞有关的延迟定义还有输入延迟、输出延迟、路径最大延迟和路径最小延迟。输入延迟指的是数据到达输入端口的延迟,输出延迟是数据离开输出端口的延迟,它们主要用于输入和输出端口的时序匹配。
在模块级设计中,输入延迟与输出延迟是模块之间的时序接口,输入延迟主要用于匹配另一接口模块的输出组合电路的路径延迟,而输出延迟则为另一接口模块的输入组合电路的路径延迟预留一定的时间范围。在芯片设计的顶层,输入输出延迟可作为芯片和板级设计之间的时序接口,主要是预留给PCB上走线的延迟。
最大最小延迟一般是满足特殊时序所规定的要求,可以是芯片的一个端口到达另一个端口的延迟要求,也可以是芯片内部的某个寄存器到达另外一个寄存器的延迟。
在输入输出端口,需要分别定义驱动能力和负载大小。定义输入端口的驱动能力可以是标准单元库中的一个缓冲器(buffer,BUF)单元,也可以是指定的电阻值。在芯片的顶层常指定特定的阻值,也即定义输入电阻的大小,由于在顶层驱动的是负载较大的I /O单元,故需要的驱动能力较强,典型的值是0. 05,单位取工艺库中电阻的单位,一般为kΩ;在模块级设计中,则用某个单元来定义,常用中等驱动能力的BUFX2,驱动能力太小(例如BUFX2)会导致优化时插人多余的BUF,而驱动定义得太大(如BUFX16)会造成优化时插入的BUF不足,从而造成两个模块拼接时时序的违例。
输出负载指的是与输出端口相连接的负载,其值为电容,一般单位为PF。在芯片的顶层设计中,所需要定义的值与板级PCB上的负载相关。例如,某CPU设计常用的数据总线如CPU的输出数据总线、PCI总线、SDRAM总线、LCD控制和数据线等其经验负载一般取30pF,一些特殊的端口,如USB端口其负载较大,取60pF较为合理。
对于时钟的定义、时钟延迟的定义、时钟不确定性定义是为了在布局、时钟树综合和布线时提供时序约束参考点。时钟的定义将通过时钟树综合来实现,而时钟延迟和时钟抖动或不确定性(jitter或uncertainty)将在静态时序分析时进行检查。静态时序分析将根据时钟树综合和布线的实际结果,通过提取整个电路中所有的时序路径,通过计算信号在路径上的延迟传播找出违背时序约束的错误,详见静态时序分析。
2、时钟树的结构
时钟信号在物理设计中的实现结果被形象地称之为时钟树,时钟信号的起点叫做根节点(root pin或root cell),时钟信号经过一系列分布节点最终到达寄存器时钟输入端或其他时钟终点(例如,存储器时钟输入端)被称为叶节点。根节点、分布节点和叶节点都依附于的逻辑单元则分别称作根单元、分布单元和叶单元。时钟网络从根节点逐级插人驱动器(buffer、inverter) ,从而到达其叶节点,按照芯片时钟网络的约束要求产生时钟树的过程叫做时钟树综合。
今天,在基于标准单元的ASIC芯片流程中,通常扇出较大的时钟网络在综合阶段设置为“理想时钟”。在物理设计阶段,即在布局布线的过程中进行综合,而后定义为“传播时钟”进行静态时序分析,时钟树综合的实现已被公认为物理设计的关键步骤。
时钟树根据其在芯片内的分布特征,可分为多种结构,主要有H 树(H-tree)、X 树(X-tree)、平衡树(balanced tree),以及梳状或脊椎状时钟网(clock tree mesh: comb or spine)。
H-tree从中心点到达各个叶节点的距离是相等的,因此信号到达叶节点的时间理论上相等,时钟偏差理论值为0,该结构的不足是布线比较困难,扇出难以协调一致,适用于较小的设计。
X-tree也是一种实现等长互连线的方法,与H-tree相比,X-tree采用了很多非90°的互连线,与H-tree的扇出为2相比,X-tree的扇出是4。
为了减小叶节点反射电流的影响,将分支后的时钟网线的电阻提高到分支前的2倍,也即分支后的线宽为分支前的1/2,得到“裁剪状的’’(tapered)H-tree。
平衡树采用的是两个层次的驱动,比较适用于分层次的时钟树设计以及较大的时钟树综合。在顶层上,它采用一个层次的驱动插入以平衡时钟偏差,到模块级再采用模块级的驱动插人平衡时钟偏差。从图中可以看出从时钟的根节点通过一级驱动到达模块的时间是不同的,存在时钟偏差,但是比较小。
对于很大的时钟树,用时钟网络或时钟网格(clock mesh,clock grid)的方法是获取较小时钟偏差较好实用方案,如图所示。尽管当代的EDA工具能自动生成时钟网络或网格等拓扑结构,但它还是需要很丰富的经验和细致的手动方法去设计并作调整。
3、时钟树综合策略
在SoC芯片设计中,它的时钟数目多,时钟结构复杂,有很多叶节点同时属于多个时钟域,在时钟树综合时需要采取一些相关的策略。
自动时钟树综合对于自我交叉(self-reconvergent)和相互交叉(crossover)两种情况的处理方法如下:
- 自我交叉是很常见的一种情况,从PLL出来的时钟,经过不同的处理(分频或控制等)然后又通过一个选择器(mux)汇集到一起,在这种情况下,工具在被设定为处理自我收敛状态时,先综合平衡右侧tree部分的偏差(skew),然后再均衡circuit1和circuit2的偏差,从而平衡整个时钟树偏差。
- 相互交叉时钟如图所示,tree3是wb_clk和lcd_clk经过一个选择器mux所重复的部分,工具在时钟树综合时,首先综合tree3,平衡其内部偏差,然后对tree1进行综合,同时平衡其内部偏差以及到达mux输入端的延迟,最后对tree2进行综合,平衡tree2自身的偏差以及tree2与tree1之间的偏差。如果两个时钟的频率相差很多,对于其重复的区域,应当选择对快速时钟的要求作为统一目标要求再进行时钟树综合。
二、时钟树设计策略
1、综合优化
1)有用偏差
在传统的或早期的时钟树综合时,期望获得“零偏差”的时钟树。但是后来研究发现即使能够获得“零偏差”的时钟树,它的性能也不见得就是最好,有用偏差(useful skew)的概念随即被提出并应用。
从一些时钟树拓扑结构中发现,有些组合逻辑电路(如datapath)延时较大,而处于同一时钟树中的寄存器的时钟延时相对较小时,这时如果迁就延时长的组合逻辑电路,增加寄存器的时钟延时并不影响时钟树的功能。这种方法称作时钟树的有用偏差。如下图中针对组合逻辑的延时违例,我们可以在CTS之前去加快到达第一个寄存器的源(source)时钟信号,完成CTS后再去添加填塞单元(padding cell)去减慢到达第二个寄存器的靶(target)时钟信号。
显然,有用偏差就是利用时钟偏差来满足时序要求。
2)OCV与CPPR
在纳米工艺条件和12英寸硅片技术中,片上误差OCV在时序检查时已经成为非常重要的一步工作。同时人们发现在考虑OCV时,它会对时钟时序路径延时偏差(skew)和数据路径(data path)延时提出更严格的要求,因此需要在时钟树综合阶段进行分析和处理。同一个芯片上的误(OCV,on-chip variation)会对芯片的时序产生直接影响。如两个相同的缓冲器单元在输入信号变化和负载相同的条件下,由于在芯片上所处位置不同,它们的实际门延时却不同。
详见静态时序分析——On-chip Variation
3)与布局结合的手动时钟树设计
在布局布线常用流程中,EDA工具自动放置标准单元,并在要插入时钟树的时序单元附近预留一定的空间,设计者指定时钟的根节点和频率、整个时钟树最大的电容值、转换时间值以及所要达到的目标偏差值,CTS工具会根据设计者的要求将buffer单元自动地插入时钟树。当对具体的设计非常地了解时,可以采用与布局相结合的手动时钟树设计,具体实施如下:搜索所有的叶节点,根据模块之间的关系,按照一定的相对规则指导工具将其放置在芯片适当的位置。在时钟树综合阶段,先在小范围内综合各个模块的时钟,即手动设置插入buffer的级数,每级buffer所驱动的具体的叶节点,然后在顶层平衡全局时钟。
4)多驱动buffer
对负载很大的时钟树,也即叶节点数目较大的时钟树,在根节点处采用多个buffer驱动(STA不能对这种平行连接的buffer做出准确的时序计算,而需要通过SPICE仿真),从而提高驱动负载的能力,如下图(a)所示,从根节点出来的时钟其中cpu_clk的负载较大,则在根节点处扩展多个驱动后再进行后面的时钟树综合。下图(b)展示了时钟树应用的综合实例,它由三节结合组成,第一节为buffer链驱动,第二节为H-tree(也称为鱼骨状)和第三节局部时钟树(叶)。
2、异步时钟树设计
虽然同步时钟设计及其时钟树的综合较为容易实现,但由于信号传送在同一时间频率发生,通常各模块间的时钟同属于同一个主时钟,因此能量功耗也最大。如果将结构bus作成自我定时各个模块的时钟成为相互独立,时钟的偏差与平衡也就容易实现了。在实际的SoC设计中,它是以非同步时钟即异步时钟设计来实现,从而降低功耗。
- 时钟树综合对同步电路实现的优点是:电路结构简单明朗,具有较好的鲁棒性,验证简单。同步电路的缺点是:较大的时钟在物理实施时具有一定的难度,封装电感和电源电阻会在同步时钟跳变的瞬间产生很大的噪声。
- 异步电路与同步电路相反,其电路不规则,但是速度快,功耗低,将全局时钟变为多个局部时钟,成为目前人们关注的热点。
如上图所示,各级电路都有自己的局部自定时电路(self-timed circuit),各级之间通过异步握手信号完成电路的功能。异步电路的时钟控制信号一般都是异步应答信号,在同一个异步电路中,要求其涵盖的时序单元是在异步应答信号下同步工作,故异步应答信号在一个异步模块中也是需要当作特殊的时钟信号来处理。故异步电路的应用将一个大的全局时钟,抽象成各个独立的局部时钟,给时钟树综合带来了极大的方便。
3、锁存器时钟树
在一些设计中,人们发现同一时钟周期的时序不够用,而引入了时间借用(time borrowing)的概念和方法。
详见静态时序分析——Timing borrow
与寄存器相比较,锁存器的特点是数据在有效电平区间内传输,而非在时钟的边沿传输。在寄存器电路中,两个寄存器之间组合路径的延迟决定了时钟最小的周期值,如果在一个周期内,组合路径早早的完成了其功能,则将处于闲置状态,直到下个周期的到来。相对于寄存器电路,锁存器半个时钟周期内直通,故能在本周期内容忍一定的负的剩余时间或者借用下一级的时间(time borrowing),因此锁存器上的时序更容易满足。
锁存器可以实现较高频率的电路,但是锁存器在半个周期内透明的特性增加了电路的灵活性同时也带来了一定的问题。由于噪声的影响,数据上的毛刺信号很容易在锁存器电路中传递,从而造成功能的错误,因此锁存器的抗噪性比较差,在应用中要非常地谨慎。一般不提倡使用锁存器,但是在设计经验丰富,对内部电路了解较透彻,在物理设计中采用一定的抗噪方法的前提下,是可以考虑采用锁存器的。