jake的个人空间 http://blog.eetop.cn/1592 [收藏] [复制] [分享] [RSS]

日志

时钟切换(1)

热度 11已有 1893 次阅读2021-1-31 07:29 |系统分类:芯片设计

刚入行时最早看到的时钟切换电路出自下面这篇文献,第20页,Trouble-Free Switching Between Clocks 这篇极短的小文章可能是 Xilinx 元老 Peter Alfke 写的。 Peter 是我非常敬重的前辈,读过几篇他写的数字电路小文章,非常实用,受益匪浅。

https://www.xilinx.com/publications/archives/xcell/Xcell24.pdf

image.png

这个电路虽然概念上是对的,但有明显瑕疵。 如果 Select 相对于 Clock A, Clock B 是完全异步 asynchronous,电路中的两个 flip flop Select 变化时会有亚稳态 metastability的可能性。 克服这个瑕疵的 fix 很简单,把图中的单个 flip flop 换成两级 flip flop 组成的同步器 synchronizer 就可以了。

Xilinx这个电路的基本思想是 SR latch 去掉图中两个 flip flop ,最前端的两个 AND 组成一个类似 SR latch 的电路,只不过 SR Latch SR 输入换成了 Select Select inverted 为了使 SR Latch 的输出能与所需控制的时钟同步,加上了一级 flip flop 同步一下。 当然,两级 flip flop 同步会更好。Xilinx这个电路里有一个非常重要的小细节,牵涉到时钟切换的一条重要原则 --- 先关断当前选择的时钟,再使能新选择的时钟。 QB 反馈到 Clock A 那边经过一个反向再和 Select 反向 ANDQA 反馈到 Clock B 那边经过一个反向再和Select AND,保证了先关断再使能这个重要原则。

Xilinx这个电路里还有个非常重要的小细节,也是该电路的精妙之处。 这两个 flip flop 的时钟输入端有个小泡泡,意思是时钟下降沿触发。这是一个重要的设计思想。如果要 gate off 掉一个时钟,在该时钟低电平时gate off 是最安全的。 如果是在高电平时做切换,很容易造成高电平被切掉一段变成一个毛刺,这可是大大的危害。 搞笑的是网上 随便搜一下 glitchless clock switching”,会出来一大堆文章,虽然都是基于Xilinx这个电路,但大部分漏掉了低电平触发这个细节。没有完全理解就胡乱抄胡乱吹牛,比较符合南亚某大国的国民性格。嘴上吹得天花乱坠,做事毛毛躁躁。做出来的电路有时工作有时不工作。玩具上用用倒也没大问题。 这种态度用到飞机上就是 737 MAX

下面是改进的电路,一级 flip flop 换成了两级 flip flop 同步而已。

image.png

image.png

这个改进电路依然有一些不够完美的地方。 譬如电路中的 AND换成 ICG 会更好一些,对后端的工具更友好一些。以后再讨论吧。

以上是一个比较经典的时钟切换电路。 根据实际使用场景的不同,时钟切换有很多不同的实现方法,都可以做得非常经典。 时钟,复位,是数字设计里最最基本的电路,稍有不慎,就会毁了整个设计,一定要谨慎再谨慎。

顺便讲一下,在芯片设计里,这种特殊电路都应该是例化instantiate 的。 例化的好处是便于在后端流程里找到这些门。例如,这里的AND 可以用一个 bbox_and 模块。bbox_and 里例化 instantiate 库里的 CKAND2 门。时钟切换电路里例化 bbox_and 模块,给个 u_bbox_and_1  这样的 instance name 在后端设计里,就可以很方便找到 u_clkgen/u_bbox_and_1/bbox_and_0 ,加约束就会很方便。 使用 bbox 模块也是数字设计中一个重要技巧,以后有时间再讨论了。

小结一下。

1) 时钟切换的重要原则 --- 先关断当前选择的时钟,再使能新选择的时钟。

2) 当前时钟低电平时切换是比较安全的做法。

补充一下。 上面的电路只是概念上的示意图。 实际设计中要考虑 DFT, 要加 DFT clock mux, DFT reset mux,会复杂一些。 

发表评论 评论 (12 个评论)

回复 andywang3791 2021-2-1 11:11
Jake 请问后端对bbox_and_0会做什么特别的约束呢
回复 jake 2021-2-1 11:44
andywang3791: Jake 请问后端对bbox_and_0会做什么特别的约束呢
为了避免工具把 AND gate 优化掉,一般加上 dont_touch。 我个人偏好 preserve 而不是 dont_touch。 这样工具可以根据 loading 选择 AND gate 的 drive strength。
set_db [get_db insts u_clkgen/u_bbox_and_1/bbox_and_0] .preserve true

通常工具会把时钟经过的任何门都当成 clock gate。 这里的 AND gate 不是 clock gate,  不需要 clock gate timing check。
set_disable_clock_gating_check u_clkgen/u_bbox_and_1/bbox_and_0
Place & route 完成后查一下 synchronizer 的输出到 AND gate 控制端的 delay。 通常小于时钟低电平时间。 AND gate 换成 ICG 的一个好处就是不用自己查这个 path delay。 工具自动会查。 我个人推荐用 ICG 。
回复 andywang3791 2021-2-1 14:22
jake: 为了避免工具把 AND gate 优化掉,一般加上 dont_touch。 我个人偏好 preserve 而不是 dont_touch。 这样工具可以根据 loading 选择 AND gate 的 drive strength ...
preserve是否就是DC里的set_size_only,只可以让工具改size,jake 请问这里的AND gate出为何不需要check gating time,我理解这里同步器输出后<半个T就是在做gating check,后面那个OR gate我理解不需要做,因为design保证了
回复 jake 2021-2-1 15:04
andywang3791: preserve是否就是DC里的set_size_only,只可以让工具改size,jake 请问这里的AND gate出为何不需要check gating time,我理解这里同步器输出后<半个T就是在做ga ...
是的,OR 肯定不需要,也应该加上 set_disable_clock_gating_check。
电路里控制信号是时钟下降沿出来的,因为 clock to output delay,控制信号会滞后于时钟。 Cadence 工具里默认 set_clock_gate_check -setup 0.0,工具认为控制信号应该在时钟的上升沿下降沿之前,或至少是同时。 工具会在 AND gate 时钟输入端加 buffer。 这个 buffer 是不必要的。 set_disable_clock_gating_check 可以防止工具做这样无谓的调节。

Cadence 工具里的 .preserve attribute 和 DC set_size_only 是一个意思。 Cadence 工具里也可以把 .dont_touch 设置成 size_ok, 也是一样的意思。
回复 andywang3791 2021-2-1 17:54
jake: 是的,OR 肯定不需要,也应该加上 set_disable_clock_gating_check。
电路里控制信号是时钟下降沿出来的,因为 clock to output delay,控制信号会滞后于时钟。 ...
有些疑问,对于AND gate的gating check,setup check需要gating信号在clk上升沿之前,hold check需要gating信号在下降沿之后,clk到q有output delay,但是clk到下降沿dff的时间和到AND端的时间可能是不一样,所以我理解如果不做gating check了,STA就不能保证AND gate的clk和gate信号的timing关系了
回复 jake 2021-2-1 22:14
andywang3791: 有些疑问,对于AND gate的gating check,setup check需要gating信号在clk上升沿之前,hold check需要gating信号在下降沿之后,clk到q有output delay,但是clk到 ...
我的想法是不让工具去 fix timing,宁可自己手动调。 以前曾经发现 Innovus ccopt 加了不必要的 buffer, 最后还是报 violation。 Innovus 其实在 placement 的时候已经把 synchronizer 和 AND 放得很近,timing 是可以保证的。 不确定是否是老版本 Innovus ccopt 的问题。 有空我会再试验一次。
回复 jake 2021-2-5 09:51
andywang3791: 有些疑问,对于AND gate的gating check,setup check需要gating信号在clk上升沿之前,hold check需要gating信号在下降沿之后,clk到q有output delay,但是clk到 ...
更新 -- 抽空做了试验,Innovus 19.1*,不需要加 set_disable_clock_gating_check,工具可以完美理解同步器到 AND 这条路径,甚至连 OR 也不需要加 set_disable_clock_gating_check。 Cool
回复 andywang3791 2021-2-5 15:04
jake: 更新 -- 抽空做了试验,Innovus 19.1*,不需要加 set_disable_clock_gating_check,工具可以完美理解同步器到 AND 这条路径,甚至连 OR 也不需要加 set_disable_ ...
Jake, 疑惑为何OR上也不需要加呢
回复 jake 2021-2-6 00:28
andywang3791: Jake, 疑惑为何OR上也不需要加呢
Genus, Innovus 现在都能很好地 trace clock path。 工具能自动理解 clk1 经给 AND gate 后到达 OR 的一端,另一端是 clk2  经给 AND gate。 工具正确理解经过 OR 的是 clock path,不是 data path,无需 setup, hold check。 我的约束里有 set_clock_group。 可能也帮助了工具理解 clk1, clk2 互不相关。
回复 andywang3791 2021-2-7 14:05
jake: Genus, Innovus 现在都能很好地 trace clock path。 工具能自动理解 clk1 经给 AND gate 后到达 OR 的一端,另一端是 clk2  经给 AND gate。 工具正确理解经过 O ...
有道理,经过两个AND后还是clock sense,所以两个clock sense的信号在OR上也不会做clock gating check,如果把AND换成ICG,那么也一样ICG之后也是clock sense
回复 andywang3791 2021-2-20 19:43
Hi Jake,请教下,SOC里两个OSC切换,一个是RC,一个是XTAL,默认是RC,如果要切换到XTAL,想法是先enable XTAL,然后计数计到一定值输出stable,软件check之后再通过软件切到XTAL,通过glitchfree mux,有两个问题:
1. 计数器是在哪个clock下去计,用XTAL是否可以,但开始XTAL时钟还不稳定
2. 开始不稳定的XTAL时钟进到glitchfree的MUX是否有问题,因为不稳定时钟可能有毛刺
回复 jake 2021-2-21 00:55
andywang3791: Hi Jake,请教下,SOC里两个OSC切换,一个是RC,一个是XTAL,默认是RC,如果要切换到XTAL,想法是先enable XTAL,然后计数计到一定值输出stable,软件check之后再 ...
1. 考虑用RC时钟计数。理由一是RC慢,计数器可以省几位。另外如您所说,XTAL刚开始不稳定,可能有毛刺,这样的时钟是无法计数的,毛刺会造成计数器不规则跳变。
2. 不稳定的时钟进入glitchfree mux/clock switch应该问题不大。 那部分电路没有反馈,只是同步器而已,即使时钟不稳定有毛刺,应该能扛过去。 您的方案是正确的。软件保持选择当前稳定时钟,等到确认XTAL稳定后再切换。

facelist

您需要登录后才可以评论 登录 | 注册

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询 |  EETOP 创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2021-4-12 05:31 , Processed in 0.051214 second(s), 19 queries , Gzip On.

返回顶部