当前位置: 首页 > 工具软件 > mux > 使用案例 >

clk_mux及对应的约束

齐栋
2023-12-01

转载:《ASIC 中时钟 MUX 电路结构时序约束的方法分析》论文

MUX 前无逻辑的时钟结构

数字电路从时钟来源上可分为同步电路和异步电路。一个大型设计中所有逻辑很难全部是同步的,异步设计不可避免。并且,部分设计需要在不同情况下工作在不同频率,尤其在通信芯片中,由于场景多样,不仅有频率的变化,还有时钟的切换。这就需要在时钟来源上加入 MUX 器件,用来进行时钟切换。从而形成了图 1 所示的时钟结构,MUX 后逻辑会有两个时钟来源 clk_1、clk_2,随着 MUX 级联,时钟来源也可以更多。

由于时钟设计的一般原则是在靠近时钟源头的地方将各种所用频率时钟都产生,再引给内部逻辑使用,并且最好用一个模块单独处理。所以,两个输入时钟一般来自端口输入或 PLL 输出,在经过 MUX 前不驱动任何数字逻辑。

对于这种时钟结构,首先要看 MUX 的两个输入信号,如果来自端口输入或 PLL 输出,没有时钟属性,则需要先创建两个源时钟,SDC 命令如下;如果来自内部数字逻辑,已经存在时钟属性,则不需要再创建。

create_clock -name clk_1 -period $clk_period $clk1_src_pin -add

create_clock -name clk_2 -period $clk_period $clk2_src_pin -add

对于 MUX 后时钟约束的方法,根据两个输入时钟的同异步关系,分别进行讨论。

2.1 异步时钟 MUX

如果确定 MUX 两个输入时钟是异步,或者对于两个时钟来自端口输入或模拟 PLL 输出这种一般异步的情况,根据 STA 工具的分析原理,MUX 后都可以不创建派生时钟,工具基于两个时钟分别进行时序分析,只需用 set_clock_groups 设定两个时钟的同异步关系即可,SDC 命令如下所示。

set_clock_groups -asynchronous -name clk_async -group “clk_1” -group “clk_2”

2.2 同步时钟 MUX

对于 MUX 前两个时钟是同步的情况,本文抽象成如图 2 所示结构进行分析,这也是一种很常见的情况。MUX 两个输入时钟来自同一源时钟,一个输入是源时钟 clk_src,另一个是源时钟的分频时钟,该分频为寄存器实现的数字分频。

对于该时钟结构,因为时钟只能通过组合逻辑,对于时序逻辑的输出,STA 工具认为是数据,所以分频寄存器 Q 端的分频时钟是一定要创建的,SDC 命令如下。由于该时钟定义点是时序器件,此时不能加 -comb 选项。

create_generated_clock -name clk_div $clk_div_pin –divide_by N –master clk_src –source $clk_src_pin -add

对 MUX 后时钟约束的处理,存在下面几种约束方法。

(1)MUX 后不创建派生时钟。为了使时钟约束更简洁,由于 MUX 任何时候只能让一路通过,MUX 后可不创建时钟,直接将 clk_div 和 clk_src 两个时钟设 logical_exclusive(逻辑互斥)即可。这种约束方式与异步时钟的情况类似,SDC 命令如下。

set_clock_groups -logically_exclusive -name clk_div_logi_async -group “clk_src” -group “clk_div”

logical_exclusive 表示两个时钟在逻辑上不会同时存在。因此 STA 工具在进行分析时,每条路径只会用一个时钟进行时序分析,不会让这两个时钟互相检查,这样更符合实际情况。其实,由于时钟树的 Last common point 在 MUX 后,PT(prime time)会自动进行 CRPR 补偿,即使不设逻辑互斥,根据 PT 的分析结果看,也不会引入悲观分析。

(2)MUX 后创建一个派生时钟。当 MUX 后只创建一个时钟时,由于在 MUX 的两个输入时钟 clk_div 和 clk_src 中,clk_src 的频率更高,所以设clk_src 为 master_clock。时钟约束方式如下。

create_generated_clcok -name clk_mux0_clk_src $mux_y_pin -divide_by 1 -master clk_src -source $clk_src_pin -add -comb

由于 clk_src 是从 MUX/I0 传来,在 MUX 后创建 clk_mux0_clk_src 时钟会将从 MUX/I1 传来的 clk_div 时钟挡住,让后面驱动的逻辑看不到 clk_div 时钟,从而不会用 clk_div 进行时序分析,这是 STA 工具的特性。对于能通过的 clk_src 时钟,加与不加 -comb 选项也存在差异,根据 PT 的分析结果,具体分析如下。

不加 -comb 选项时:对于 clk_mux0_clk_src 时钟,PT 计算其时钟树延时(clock latency)时,会分别计算 MUX 的两个输入路径,选择对时序结果更悲观的。但由于所有路径时钟树的 Last common point 在 MUX 后,PT 会自动进行 CRPR 补偿,实际不会影响分析结果。

当加 -comb 选项时:MUX 后派生时钟 clock latency 不走 MUX/I1,相当于 clk_src 在 MUX 后改了名字,PT 计算 clock latency 时只分析 MUX/I0 这个路径,所以不会悲观分析。当实际 MUX 选择I1 时,同样由于时钟树的 Last common point 在 MUX 后,PT 会自动进行 CRPR 补偿,所以没有问题。

(3)MUX 后创建两个派生时钟。对这种结构,更通常的做法是,在 MUX 的输出点创建两个派生时钟,master clock 分别设为 clk_src和clk_divn,将所有时钟设同步,然后 MUX 后这两个时钟设physical_exclusive,SDC 命令如下所示。

create_generated_clcok -name clk_mux0_clk_src $mux_y_pin -divide_by 1 -master clk_src -source $clk_src_pin -add -comb

create_generated_clcok -name clk_mux1_clk_div $mux_y_pin -divide_by N -master clk_div -source $clk_div_pin -add

set_clock_groups -physically_exclusive -name clk_mux_phy_async

-group “clk_mux0_clk_src” -group “clk_mux1_clk_div”

如上述分析,第一条命令最后的 -comb 选项可加可不加,加了更符合意图,第二条命令最后一定不能加 -comb。另外,第两条命令必须要加 -add。由于这两个 generated clock 创建在同一个点,MUX 一次只能选择一路时钟通过,这两个时钟不能共存,所以需要将两个时钟设 physically_exclusive,这也是跟 logical_exclusive 的区别。时钟分组设置推荐按照鱼骨图的方式层次化设置,由于所有时钟同步,只有一个 group,命令无法设置,不设同异步关系时,工具默认按同步分析。

3 MUX 前有逻辑的时钟结构

上面分析的是 MUX 前无逻辑的时钟结构,但还会存在如图 3 这样的情况,时钟源 clk_src 已经驱动部分逻辑,在逻辑内部又对此时钟进行分频和选择,后面逻辑 reg1、reg2 的时钟需要切换,而且 reg0 跟 reg1、reg2 之间有路径交互。这种结构比上述结构多了 reg0/Q → reg1/D 的路径。

对此结构,本文同样分情况进行讨论,分别对上述各方法的可行性进行分析。

(1)对这种时钟结构,上述第一种时钟约束方法已行不通,因为会存在将 reg0 和 reg1 设成异步的问题,导致部分同步路径没有进行时序检查,这些漏查的路径可能使生产的芯片无法正常工作。

(2)对于 MUX 后只创建一个派生时钟的约束方法,由于派生时钟的 master_clock 设为 I0 传来的 clk_src,会将 I1 传来的 clk_div 时钟挡住,工具无法用 clk_div 时钟进行分析和优化。而且,由于时钟树的 Last common point 在 MUX 前,工具无法进行 CRPR 补偿,所以该方法存在问题。此外,加与不加 -comb 选项的问题也不同,下面分别分析。

当加 -comb 选项时:对于路径 reg0/Q → reg1/D 的 capture clock latency,由于工具只分析检查了通过 MUX/I0 的情况,当 MUX 切换到 I1 时,由于经过寄存器 DIV_N 分频的路径一般比 MUX/I0 的路径延时要长,reg1 的时钟树可能变长,这就可能导致 setup 不满足时序要求,从而引发异常。可见,该方法会导致时序分析不全面。

当不加 -comb 选项时:对于 reg0/Q → reg1/D 这条路径,同样由于 MUX 两个输入延时不同,工具按照悲观原则,在进行 setup 检查时,对 capture clock latency 计算会采用 ckl_src → MUX/I0 这条路径;在进行 hold 检查时,对 capture clock latency 计算会采用 ckl_src → DIV_N → MUX/I1 的路径。如果存在 reg1/Q → reg0/D 的路径,对于 launch 时钟 latency 的计算也会出现上述情况。

可见,第二种约束会导致工具看到的 TimePath(时序路径)时序更紧,不容易满足,甚至满足不了。而实际情况是,不论 MUX 选择哪路,对于 setup和 hold,锁存寄存器的时钟都应该走同一路。所以问题在于约束不准确,工具分析过度悲观。

(3)对于上述 MUX 后创建两个派生时钟的约束方法,虽然该方法相对复杂,需要创建两个时钟和设置一个额外的时钟分组,但约束准确,工具能够正确进行分析。不过,当 MUX 级数和时钟来源增多时,时钟数量会翻倍增加。时钟太多时,会增加出错的风险。所以,要让时序约束在准确的前提下尽量简洁。

(4)对此结构,除上述三种方法外,还有一种方法。如图 4 所示,通过在 MUX/I0 这路上例化一个 ICG,这样只需要在 ICG 后创建一个一分频的时钟,然后跟 clk_div 时钟设置 logical exclusive 即可,MUX 后不需要再创建时钟,SDC 命令如下所示。这种方法相对简洁,既不会引入额外异步设置,也不会出现过度悲观分析的情况。只是需要提前在代码中例化 ICG。

create_generate_clcok -name clk_icg $icg_pin -divide_by 1 –master clk_src -source $clk_src_pin -add

set_clock_groups - logically_exclusive -name clk_icg_div_logi_async

-group “clk_icg” -group “clk_div”

(5)在上述(4)结构的基础上还存在一种更复杂的情况,如图 5 所示,DIV_N 在 MUX 前驱动逻辑 reg3。对于这种结构,上述的方法(3)依然适用,而且不会存在风险。但对于方法(4),当 MUX 选择I0 时,则会存在将 reg2 和 reg3 设置成异步的问题。可见,简洁的方法适用条件更受限,相对复杂的方法(3)是最保险也是最推荐的约束方法。

4 原理分析

对于 MUX 前有逻辑的时钟结构,目前只有方法(3)最可行,下面通过分析 STA 工具的原理对第(2)种方法不可行的原因进行深入分析。

方法(2)问题发生的原因在于 MUX 后只创建 I0 路时钟的派生时钟会把 I1 来的时钟挡住传不下去,工具进行时序分析时看不到 I1 路的时钟,不会进行分析和优化。

其实,无论怎样约束,工具在进行时序分析时的原理和原则都是一样的。正确的约束能工具看到正确的路径,从而将逻辑优化的更合理、更全面。但不论工具怎样计算,都是基于路径的实际延时,当 clk_src 到 MUX 的两个输入延时几乎一致时,工具无论选择走哪路,延时差别很小,也就几乎不会影响时序检查的结果了。当然,因为不同 corner 的延时不同,而且不同 CELL 的延时也是变化的,实际不可能将两路做的完全等长。再加上 derate 的影响,悲观的影响总是存在的,但只要两路延时相差不大(比如 16 nm 工艺下不超过 10 ps),影响已完全可以忽略。

所以,电路真正实现还是要靠将两路做等长。但不一致的路径越长越不容易做等长。因此还是尽量将时钟产生逻辑放在一个模块内,且尽量放在功能逻辑之前。此外,不一致的时钟路径条数越多,也越不容 易做等长,所以时钟结构设计时尽量不要出现如图 6这种结构。图中不论发送寄存器还是接受寄存器,时钟树都有两条路径,也就是需要将 4 条时钟路径做等长,这会给后端实现引入很大的难度。

在 ASIC 流程的不同阶段,对时序约束的要求也不一样。例如,在 SYN 及 PLACE 阶段,时钟是理想的,对于本文所讲的 MUX 结构,在 MUX 后只创建高频时钟,或者只要高频时钟能穿过,就不会影响工具对时序路径的分析和优化。但在 CTS 之后,由于工具看到了时钟树信息,进行 STA 分析时,对 launch和 capture clock latency 的计算,工具会遵循悲观原则,选择更恶劣的路径,这就可能导致同一条路径在检查 setup 和 hold 时,时钟所走的路径不一致,出现过度悲观的情形。所以推荐使用各阶段都适用的时序约束方法。

 类似资料: