许浒,王逵,方昊,吴费维
北京大学微处理器研发中心
在现代超大规模集成电路设计中,往往存在多个不同频率的同步时钟,它们一般通过时钟产生模块(clock module)对单一的来自时钟振荡器的高频时钟进行分频和门控处理得到。现代芯片工作频率高,而同步时钟信号的平衡对于保证电路时序性能至关重要,因此芯片设计中对时钟产生模块的输出时钟性能有较为严格的要求。影响这些输出时钟平衡的时钟偏差(clock skew)可以分为以下几类:
1. 多时钟偏差,要求平衡的不同时钟间的偏差;
2. 沿偏差,同一时钟上升沿和下降沿延迟间的偏差;
3. 路径偏差,对于同一时钟沿,时钟输入到时钟输出间的重汇聚路径间的路径偏差;
4. 逻辑偏差,一些特殊逻辑门中某一输入端到输出端的延迟依赖于其他输入端的逻辑值,从而造成时钟偏差。
本文以尽量消除上述四种时钟偏差、实现时钟产生模块输出时钟的平衡为目标,基于Synopsys的Design Compiler、Astro、Primetime等工具,提出了一系列在芯片物理实现阶段降低时钟产生模块时钟偏差的技术手段,对时钟产生模块的逻辑结构进行了改进,以保证在进行芯片后端实现前已经具备了比较理想的结构,不存在固有的时钟偏差。在已经通过国家863项目验收的北大众志系统芯片中的实践结果表明,本文提出的这些方法可以有效的降低时钟产生模块的时钟偏差,达到时钟产生模块内部时钟信号传播路径分支平衡的目标。
In the design of Super Large-Scale Integration Circuit, a single chip often contains several clocks of different frequencies. These clocks are usually generated by Clock Module, and divided from the unique high frequency clock generated by PLL. Modern Integrated Circuit works at high frequency, thus, the quality of the clocks from Clock Module is always crucial in the IC design. Clock skew is one of the most important factors that affect the timing, so balancing synchronous clock signals is very important to enhance the performance of circuits.
Clock skews in Clock Module can be sorted as follows:
1. Skews between different clocks;
2. Skews between different edges of the same clock;
3. Skews between different paths at the same edge;
4. Skews due to different logic environments in the same path;
To balance the clock paths in Clock Module and eliminate the four types of clock skew mentioned above, we propose a series of techniques in the physical implement of Clock Module, mainly for improvement in the logic structure of Clock Module, based on Synopsys Design Compiler, Astro and Primetime. The experiment result in PKUnity863II SOC of Peking Univ. shows that these techniques are efficient in eliminating or decreasing the clock skew and balancing the clock propagating paths in Clock Module.
1 简介
在现代数字集成电路设计中,时钟信号的作用日益重要。随着对芯片速度要求的提升,对时钟频率的要求也愈来愈高。同时,由于对芯片功能和适用范围的需求越来越广,芯片内部集成的功能模块种类和数目也日益繁多,对系统芯片而言更是如此。因此,对芯片时钟信号也就有了越来越复杂的要求。随之而来的,是对这些时钟信号自身性能及相互之间配合的严格要求。
目前,普遍采用的设计方法是通过统一的时钟产生模块(clock module)来对锁相环(PLL)产生的高频时钟按不同的分频比进行分频后从时钟产生模块的输出端口得到,如图1所示。
图中的div为分频模块,根据需求,有固定分频比、可配置分频比等多种类型,其输出为经过分频后的时钟信号。以北大众志PKUnity863II系统芯片的时钟结构为例,典型的系统芯片时钟结构如图2所示。
mclk为供给CPU的主时钟,被mclk_en信号门控;mclk_s和bclk_s用于reset寄存器复位;bclk为系统的总线时钟;Div为时钟分频模块。
随着工艺技术的进步和特征尺寸的减小,在深亚微米及纳米级集成电路设计中,可测性设计技术(DFT)的作用十分重要,这样便涉及到对时钟结构的更改,需要将测试时钟与功能时钟结合考虑。一种普遍采用的解决方案如图3所示。
时钟信号数量的增加和可测性设计方面的综合需求,使得设计者对时钟产生模块输出的时钟信号的性能有了更高的要求。本文提出了以改进时钟产生模块逻辑结构为主、旨在提高时钟产生模块输出时钟质量的一系列方法,并通过在北京大学微处理器研发中心所设计的PKUnity86系统芯片上的应用对这些方法进行了实践和验证。实验结果证明,本文提出的这些技术方法可以有效地降低时钟产生模块内部形成的时钟偏差,为系统各功能模块提供高质量的同步时钟信号。
本文的组织如下:第一章为简介;第二章对时钟产生模块产生时钟偏差从而影响输出时钟质量的问题进行描述;第三章介绍我们用于改善时钟产生模块内部时钟偏差的方法;第四章列出实验结果并进行了简要对比;第五章对全文进行总结。
在数字集成电路设计中,时钟信号的质量是影响电路速度的重要因素。表征时钟信号质量主要包括以下几方面:时钟频率、时钟偏差(clock skew)、噪声和毛刺、上升和下降时间等。在频率目标固定、时序路径优化余地有限的情况下,时钟偏差时常制约电路时序性能的重要因素。时钟偏差对芯片速度的限制如图4所示:
由于一般的时序违例(timing violation)以setup违例居多,且hold违例相对而言更易修复,因此,以下以讨论setup违例为主。
对图4所示时序路径,若CK1与CK2之间不存在差异,则组合逻辑电路Com的数据传输时间 必须满足 。 为时钟周期, 为寄存器Reg1的内部延迟, 为Reg2的数据建立时间(setup time)要求。由于CK1和CK2间时钟偏差 = - 的存在, 。如图4所示的负偏差( )将导致 < ,即对组合逻辑Com的时序要求变严。当Com无法进一步优化时,只能通过提高 或者降低 的绝对值来满足要求。在保证较高的时钟频率即保证较低的 的要求下,降低 成为使路径满足时序约束的最主要的手段。因此,尽量减小时钟偏差成为时钟结构设计和实现的重要目标。从时钟产生模块输出的时钟需要经过时钟树或者时钟网络传播到各个寄存器。减小时钟产生模块产生的时钟偏差对于降低实现后续时钟信号传播的难度有着重要的影响。
在时钟产生模块内部,主要存在以下几种时钟偏差:
1. 多时钟偏差。要求平衡的不同时钟间的偏差;
2. 沿偏差。在系统芯片设计中,经常会同时使用时钟的上升沿和下降沿,如果不同沿之间存在路径,则也要求他们能够平衡。同一时钟上升和下降沿的不平衡称为沿偏差。在标准单元库中,沿偏差形成的一个重要原因是上升延迟和下降延迟不完全对称性,即使如TSMC0.13HS库中上升延迟和下降延迟很对称的CLKINV门,当负载比很大的时候两者仍然相差2%~3%左右,其他门的延迟甚至能够相差50%;
3. 路径偏差。对于同一时钟沿,时钟输入到时钟输出间存在两条以上的分叉到重合的路径,即重汇聚路径,重汇聚路径间的结构不对称性将产生路径偏差;
4. 逻辑偏差。一些特殊逻辑门中某一输入端到输出端的延迟依赖于其他输入端的逻辑值(如TSMC0.13HS库中的异或门XOR2X1HS),从而造成时钟偏差。
因此,针对以上不同种类的时钟偏差分别采取措施予以消除或减小对于保证时钟产生模块的输出时钟质量来说是非常必要的。设计时钟产生模块,除了实现正确的分频和工作模式选择,还要尽量减小以上因素造成的时钟偏差。
以图2所示的PKUnity863II系统芯片的时钟结构为例,它所需要的时钟产生模块以PLL的高频输出信号PLL_FOUT和旁路时钟信号CLK_BYP为输入;输出供给CPU的主时钟MCLK和用于复位的MCLK_S,以及供给总线的时钟BCLK和BCLK_S。它的设计目标主要包括两方面:
1. 满足600MHz的时序要求。时钟产生模块内部的时序路径需满足相应的setup和hold限制;
2. 使得需要平衡的各时钟从时钟产生模块的输入到输出的延迟(latency)相等。在图2所示的电路中,即是要求尽量消除MCLK与MCLK_S间的skew、BCLK与BCLK_S间的skew以及DFT造成的skew。这部分设计任务是本文重点讨论的内容。
初始的带DFT的时钟产生模块结构如图3所示,DFT需要在TM=1的情况下所有分频门控时钟可以直接被测试时钟控制,因此需要插入较多的多路选择器(MUX)。由于MUX的存在,在时钟信号生成路径上引入了较大的延迟,并且一般的标准单元中MUX的两个输入端到输出端的延迟相差较大,因此,在电路不同的工作模式下将形成时钟信号传播时间的差异,从而容易引入skew。TSMC0.13HS标准单元库中Typical Process下MUX延迟如表1所示。
表 1
延迟(ns) MX2X1 MX2X2 MX2X4 MX2X8
A->Y (rise) 0.074 0.0727 0.0823 0.1093
A->Y (fall) 0.1253 0.1067 0.1234 0.1703
B->Y (rise) 0.0708 0.0698 0.0787 0.1052
B->Y (fall) 0.1246 0.1112 0.1277 0.1746
改进图3所示的DFT电路结构如图5所示。
本改进主要是利用了图3中MX2和MX4之前的使能信号同步电路,将测试控制信号的或门前移代替了原有的MUX的功能,从图5可以看到,改进后节省了mclk和bclk产生路径上的两个MUX。这种改进主要的优点有:减小了电路面积;减小了时钟产生路径上的延时;保证在不同的工作模式下时钟信号延迟尽量相同;更易满足hold检查的要求。
时钟产生模块中,最为关键的部分是时钟分频器(clock divider),它包含了复杂的分频控制逻辑,并且存在时钟信号的重汇聚路径,在其内部主要有下列三种skew:
1) 不同时钟信号传播路径上逻辑门不同而导致的skew;
2) 分频器输出前经过异或门(XOR),由于不同输入端到输出端延迟不同而导致skew;
3) 不同寄存器内部延迟( )不同导致的skew。
如果不设法消除或减小以上分频器内部的skew,将导致分频器输出的时钟信号质量较差。在初步逻辑综合满足时序要求后,我们通过以下几种途径减小时钟分频器的skew。
如图5所示的Div模块即是典型的分频器结构,由于主要分析时钟信号的传播路径,因此省略了生成控制信号的组合逻辑部分。观察Div中的上下两个触发器,reg1为上升沿触发,reg2为下降沿触发。由于它们属于两种不同类型的触发器,内部延迟有差异,将导致它们的输出存在时间差。因此,将其改进如图6所示。
将原有的下降沿触发器reg2更改为图6所示的上升沿触发的div2_reg,与原有的上升沿触发器reg1即图6中的div1_n_reg完全相同,但是需要在div2_reg的CK端之前插入反相器以保证逻辑功能的正确性。同时,由于在div2_reg的时钟传播路径上插入了反相器,导致上下两条时钟路径信号延迟出现较大差异,因此,需要在div1_n_reg的时钟路径上插入一个反相器作为平衡。修改的结果如图6所示,在div1_n_reg的输入和输出端各插入一个反相器,在平衡了时钟路径的同时保证了逻辑功能的正确。经过这种改进,可以保证时钟信号在到达XOR的A、B端时延迟基本相等。
图6中所示的上下两个时钟信号最后通过异或门处理后输出,在一些情况下,逻辑综合工具将自动使用一系列简单逻辑门实现异或逻辑,这种实现方式往往导致输入A和B到输出端的延迟不同,出现重汇聚路径的偏差问题。而使用标准单元库中的异或门如TSMC13HS中的XOR2X1HS,亦会出现前面提到的逻辑偏差。因此,我们手动搭建异或门如图7所示。
图中选用两个输入端到输出端延迟基本相等即较为平衡的与非门,例如TSMC 0.13HS的CLKNAND2X1,从而保证虚线范围XOR_2内各条路径的平衡。
如图6所示,A、B两个时钟信号到达异或门之前已经基本平衡,在图7中,由于两个反相器的存在,将导致在信号进入虚线范围的输入之前即已存在skew,影响输出的时钟信号质量。因此,优化分频器结构如图8所示。
通过复制div1_n_reg为div1_reg,复制div2_reg为div2_n_reg,分别生成时钟信号A, AN, B, BN。分析四条时钟信号的传播路径,均只存在1个反相器,可以大大减小分频器中时钟信号重汇聚路径的路径偏差,从而保证上述4个时钟信号的平衡。
和初始的分频逻辑相比,我们使用的分频逻辑有以下特点:
1. 将原来的2路分叉的重汇聚路径变成了4路分叉的重汇聚路径。虽然重汇聚路径增加了,但是由于改变了路径构成,相互之间更容易平衡;
2. 除了计数器以外使用了4个相同类型的上升沿触发的寄存器,少了一个下降沿触发的寄存器,这样所有的寄存器内部延迟基本一致;
3. 增加了5个同类型的反向器;
4. 重构了较为平衡的异或门。
复制寄存器在一定程度上增加了面积,提高了电路复杂度,但是对平衡重汇聚路径而言具有十分显著的作用。对于以保证时钟信号质量为首要目标的时钟产生模块而言,这种改进是必要的。
在上述各种改进方法中,均涉及到手动插入标准单元,根据平衡的要求,尽量选择以下类型中尺寸最小的标准单元。
1) 触发器
替换及复制触发器及寄存器时,尽量使用具有以下特性的触发器:上升和下降沿传播延迟相等;单元延迟(cell delay)较小。
2) 与非门
在图7的改进中,需要手动修改网表或者使用Design Compiler中特定的命令加入与非门。整个时钟产生模块中,即使在改进后也存在一定数量的多路选择器,如MX1和MX3。时钟信号的平衡是最重要的目标,因此,应尽量选择具有以下特征的与非门和选择器:各输入端到输出端的延迟差 很小;上升和下降沿传播延迟差 很小。
3) 在TSMC0.13HS库中,提供了一些专用于处理时钟信号的标准单元,例如CLKMUX,CLKNAND,CLKXOR,这些门在一定程度上考虑了信号平衡问题,可以优先使用。
如图3所示的电路中,MX3的两个输入时钟信号的延迟由于分频器的存在而有较大差异。同时,mclk和mclk_s,bclk和bclk_s之间的延迟差也存在较大差异,这些都将产生较大的时钟偏差。因此,需要通过在较快的传播路径上插入延迟元件来实现时钟信号间的平衡。同时,各时钟自己的沿偏差也需要进一步调整。我们采用反相器链来实现这些功能。反相器链的作用包括:提供特定的延迟;调整边沿偏差(edge skew)。反相器链的结构如图9所示。
使用反相器而不是缓冲器(buffer)的主要原因是反相器对可以使得沿互补,从而减小沿偏差。我们构建的反相器链具有如下特点:
反相器链的数目为偶数;
第2n-1个反相器和第2n个反相器类型相同;
第2n个反相器和第2n+1个反相器类型差别尽可能小。
以上3点都是为了保证沿偏差尽可能的小,并且为了clk1和clk2能够驱动较大的负载,最后一级的反相器一般都用最大的CLKINVX20HS,同时前面的反相器链类型尽量变化平坦。
使用反相器链可以构建某个特定的延迟,图9中的clk1和clk2如果不计算反相器的延迟,显然clk2的延迟会比clk1的大不少,反相器链的首要目标是便是调整时钟延迟使得多时钟偏差尽量的小。
在基本满足多时钟偏差的同时可以利用反相器的延迟曲线特点来使得通过它们的时钟信号的沿偏差也尽量的小。
经过观察,我们发现,标准门中的反相器的延迟曲线都具有如图10所示的特点:在外部条件都一样的情况下,上升延迟比下降延迟大,并且差距随着负载的增加而增加。这样,我们就能够在反相器链的适当位置加入假负载,来调整沿偏差。
在实际应用中,我们通过DC脚本实现了自动查找需要的假负载的负载电容,并使用查表的方法去标准单元库中拼接得到相应的负载。首先列出库中各单元的端口负载及面积,将其分类排序,然后使用DC中的set_load命令对需要进行调整的路径添加负载。
在逻辑综合阶段进行上述改进后,时钟产生模块的逻辑结构图如图11所示。
上述各种改进措施均涉及到对电路结构的更改,因此,有必要对每一步更改进行验证。PKUnity863II项目中,使用Formality对更改电路进行了等价性检查。由于主要是修改了组合逻辑,未涉及寄存器的retiming,因此正确的更改是比较容易通过的。但由于复制了寄存器,需要对formality作额外的设置如下:
set_user_match –type cell
r:/WORK/clk_divider/div1_reg i:/work/clk_divider/div1_reg
set_user_match –type cell –inverted
r:/WORK/clk_divider/div1_reg i:/work/clk_divider/div1_n_reg
set_user_match –type cell
r:/WORK/clk_divider/div2_reg i:/work/clk_divider/div2_reg
set_user_match –type cell –inverted
r:/WORK/clk_divider/div2_reg i:/work/clk_divider/div2_n_reg
对电路结构的修改主要在逻辑综合阶段完成,剩下的布局布线的工作全部用Astro来实现。时钟产生模块一般都比较小,可以直接使用Astro的autoplace,效果比较好。需要注意的是,要将Astro的优化timing和logic remapping选项去掉,以保留我们的修改结果,并打开prevent Xtalk选项。使用Astro进行auto place和route的设置如图12所示。
Astro进行Place和route之后的layout如图13所示。
布局布线完成后,使用Primetime对时序结果进行检查。PT脚本设置如下:
proc constrain_all {} {
set ::t1 1
############################################################
# div1a,div1b,div2a,div2b对应图8中XOR_2的A、AN、B、BN
############################################################
set ::path [list \
BCLK_div1a bclk \
BCLK_div1b bclk \
BCLK_div2a bclk \
BCLK_div2b bclk \
BCLK_div1a bclk_s \
BCLK_div1b bclk_s \
BCLK_div2a bclk_s \
BCLK_div2b bclk_s \
PLL_Fout bclk
PLL_Fout bclk_s
PLL_Fout mclk_s
PLL_Fout mclk ]
create_clock –name MCLK [get_port PLL_Fout ] –period 1.5
create_clock –name BCLK_div1a –source [get_attribute [get_clocks MCLK] sources] [get_pins $XOR_2_A] –divide_by 1
create_clock –name BCLK_div1b –source [get_attribute [get_clocks MCLK] sources] [get_pins $XOR_2_AN] –divide_by 1
create_clock –name BCLK_div2a –source [get_attribute [get_clocks MCLK] sources] [get_pins $XOR_2_B] –divide_by 1
create_clock –name BCLK_div2b –source [get_attribute [get_clocks MCLK] sources] [get_pins $XOR_2_BN] –divide_by 1
set_propagated_clock [all_clocks]
set_disable_timing [get_cells –h counter*_reg*]
set_disable_timing [get_cells –h *en_reg*]
set_disable_timing [get_cells –h rst_*reg*]
foreach {p1 p2} $::path {
set_max_delay $::t1 –from $p1 –to $p2
set_min_delay $::t1 –from $p1 –to $p2
}
set_input_transition 0.1 [all_inputs]
set_load [expression 16*[load_of typical/CLKBUFX20HS/A]] [all_outputs]
#为保证不同工作模式下时钟偏差都很小,下面两句被除去,当要求放宽时,可以考虑加上
#set_case_analysis 1 [get_ports TM]
#set_case_analysis 0 [get_ports BIST_TM]
}
proc report_skew {} {
set i 0
foreach {p1 p2} $::path {
incr i
set s_max [get_attribute [get_timing_path –from $p1 –to $p2] slack]
set s_min [get_attribute [get_timing_path –from $p1 –to $p2 –delay min] slack]
set p_max [expression $::t1-$s_max]
set p_min [expression $::t1+$s_min]
echo “Path $i (PLL_FOUT -> $p1 -> $p2) : $p_max/$p_min”
}
}
proc report {} {
remove_design –all
read_verilog clk_module.h.v
current design clk_module
set ::si_enable_analysis true
set ::timing_remove_clock_reconvergence_pessimism true
set ::si_xtalk_reselect_critical_path false
reset_design
constrain_all
read_parasitics –keep_capacitive_coupling –increment –format SPEF clk_module.sped
report_skew
}
在北京大学微处理器研发中心的PKUnity863II系统芯片中,我们实践了上述改进技术,目前,该芯片已经试流片并通过国家863项目验收。PKUnity863II系统芯片采用TSMC0.13HS标准单元库,设计主频600MHz,它的时钟产生模块初始设计如图3所示,经过上述技术改进后,时序结果如表2所示。Logic表示DC逻辑综合后Primetime报出的结果;Post P&R表示使用Astro进行布局布线后Primetime报出的结果。
时钟偏差(ns) Logic Post P&R
mclk & mclk_s (rise) 0.001 0.01
mclk & mclk_s (fall) 0.001 0.01
bclk & bclk_s (rise) 0.01 0.02
bclk & bclk_s (fall) 0.01 0.02
最关键的分频器模块,经过优化后其内部时钟信号的skew明显减小,4条重汇聚路径延迟的实验结果如表3所示。PLL->XOR_2/A->bclk表示时钟从PLL输出,经过图8中所示分频器的XOR_2/A端口再输出到bclk端的时钟信号传播路径。
时钟信号延迟(ns) Logic Post P&R
PLL->XOR_2/A->bclk 1.117 1.24
PLL->XOR_2/AN->bclk 1.118 1.27
PLL->XOR_2/B->bclk 1.126 1.27
PLL->XOR_2/BN->bclk 1.126 1.26
主时钟mclk与总线时钟bclk间的偏差在时钟产生模块内未作细致调整,这是因为在时钟产生模块外部,mclk与bclk将分别生长时钟树,时钟结构的物理实现对最终到达寄存器时钟端口的偏差的影响更大。因此,在时钟产生模块内产生的这两个时钟信号间的偏差可以在外部统一进行调整。
本文提出了一系列在芯片物理实现阶段用于减小时钟产生模块中时钟信号偏差、实现时钟产生模块分支平衡、保证输出时钟信号质量的技术。这些技术主要通过改进时钟产生模块的逻辑结构、消除电路结构固有的时钟偏差来平衡模块内部的时钟传播路径的分支,为后端实现提供理想的的工作起点。实验结果表明,这些方法能有效降低时钟产生模块内部形成的多种时钟偏差,保证时钟产生模块输出时钟信号的质量。这些改进技术可以方便的扩展应用到时钟产生模块需要分频输出更多时钟的情况。
[1] M.Arora, “Clock dividers made easy,” [C].SNUG Boston, 2002.1-19,
[2] K.C.Y. Mei, “Bridging and stuck-at faults,” [J].IEEE trans. on Computers, 1974,C-23(7).
[3] Krstic and K.-T. Cheng, [M].Delay Fault Testing for VLSI Circuits. Boston: Kluwer Academic Publishers, Inc. 1998.
文章评论(0条评论)
登录后参与讨论