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

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

时钟切换(1)

热度 33已有 7429 次阅读| 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

切换波形 – fast to slow

image.png

切换波形 – slow to fast

image.png

这个改进电路依然有一些可以变化的地方。 譬如电路中的 AND换成 ICG 貌似更好一些,对后端的工具更友好一些,实际上ICG在初始状态有一个额外要求,不见得是好的选择,见补充2

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

顺便讲一下,在芯片设计里,这种特殊电路都应该是例化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,会复杂一些。 

补充2

前面讲了可以考虑把AND换成ICG。一位网友指出,换成ICG后如果时钟的初始值时高电平,电路可能会出问题。 首先感谢这位网友,谢谢指出这个与ICG特性有关的重要问题。

下面是改用ICG后的时钟切换电路。

image.png

下面是在clk1, clk2初始值都为高的场景下该电路启动时的仿真波形。在这个特殊场景下,由于clk1, clk2初始为高,使得对应的ICG输出clk_slow_gated, clk_fast_gated初始值为X,造成切换电路输出在初始时也为X!造成这个现象的是ICG的一个重要“缺陷”未被初始化uninitialized ICG

image.png

解释这个现象,首先要先看一下这个电路里用到的ICG的内部构造。这里SE(scan mode ICG enable)E(functional mode ICG enable)latch的数据输入。Latchgate信号为CK的反向。

CK0latch打开,(E | SE)通过latchICG的输出 = E|SE& CK。因为此时CK0ICG的输出也为0

CK1latch关闭并保持以前的状态(latch_old_state)。假设CK变为1E=1latch_old_state =1ICG的输出=latch_old_state & CK= CK;假设CK变为1E=0latch_old_state =0ICG的输出=0 & CK= 0

image.png

如果初始时CLK1ICG内部的latch是关闭的,E无法通过,而且因为之前latch从来没有打开过,没锁存过任何确定的值,latch_old_state 不确定 (仿真中显示为X)。在这个场景下ICG输出= latch_old_state & CK= X& CK= X,即ICG输出为X。下面就是这个场景的波形。

如果初始时CLK0ICG内部的latch是打开的, ICG的输出为 (E & CLK) = 0ICG输出为确定值,ICG被成功初始化。下面是这个场景下的仿真波形。image.png

综上所述,为了避免上述ICG未初始化引起的问题,使用ICG搭时钟切换电路时,系统设计中要考虑加一个时钟初始为0的要求。

补充3

基于补充2的电路,还有一种变化,就是把falling edge DFF换成rising edge DFF。这时要特别小心两个时钟周期相差很大的情况。例如一路时钟为clk_slow (slow clock), 另一路为clk_fast (fast clock),选择信号sel01 (clk_slow to clk_fast switch)。当clk_slow上升沿到来,当clk_slow这一路第二级DFF的输出 (sel_sync_slow) 变为0时,并不意味着clk_slow对应的ICG输出立刻变0,而是要等到clk_slow下降沿到来。也就是说此时clk_sw的输出仍旧clk_slow的高电平。这时如果clk_slow第二级DFF输出(sel_sync_slow) 被直接送到clk_fast的选择输入逻辑,如果clk_fast非常快,就会出现clk_slow ICG尚未关断,clk_fast ICG已经打开,造成切换后的输出clk_sw出现毛刺。

image.png

为了避免这样的情况,必须引入第三级DFFICG E仍旧用第二级DFF输出,第三级DFF输出送到另一路选择逻辑。 整体来看这样的电路有点浪费资源。

补充4

上面几种电路都只能在时钟正常跑起来的情况下完成切换。如果当前选中的时钟停了,选择信号无法通过由当前时钟驱动的两级DFF,也就无法实现切换了。

时钟停止属于系统级错误,需要在系统设计找到解决方案,这里就不赘述了。

14

点赞

刚表态过的朋友 (14 人)

发表评论 评论 (34 个评论)

回复 wenfangsibao 2021-6-22 17:25
jake: 为了避免工具把 AND gate 优化掉,一般加上 dont_touch。 我个人偏好 preserve 而不是 dont_touch。 这样工具可以根据 loading 选择 AND gate 的 drive strength ...
同步器的输出端到AND gate 控制端的 delay 通常小于低电平时间。。。我同意,但是给这些逻辑单元和寄存器约束在同一个物理位置小范围内才能把 “通常” 变成“一定”。
回复 后知后睡 2021-9-15 15:28
你好,请教一下想系统性的学习了解时钟复位的规划,有什么书籍资料可以推荐的吗?
回复 jake 2021-9-16 09:26
后知后睡: 你好,请教一下想系统性的学习了解时钟复位的规划,有什么书籍资料可以推荐的吗?
抱歉,我没有看到过这方面的书籍资料,都是在实际芯片设计中学的。我个人体会是,拿一个中小规模的片子,从头做到尾,自然而然就知道了时钟,复位的基本设计规则。规模大的片子也只是在基本设计概念上多一些场景而已。
回复 后知后睡 2021-9-23 18:49
jake: 抱歉,我没有看到过这方面的书籍资料,都是在实际芯片设计中学的。我个人体会是,拿一个中小规模的片子,从头做到尾,自然而然就知道了时钟,复位的基本设计规则 ...
好的谢谢
回复 thjan65 2021-10-22 22:00
andywang3791: 有些疑问,对于AND gate的gating check,setup check需要gating信号在clk上升沿之前,hold check需要gating信号在下降沿之后,clk到q有output delay,但是clk到 ...
根據 "How Are Clock Gating Checks Inferred? " page2, Fig-2 說明. PrimeTime 不會對AND gate 做分析.
回复 ceerqingting 2022-4-13 10:06
jake, 看到ICG cell的specify中有如下的指定,没想明白为什么?此时不应该是0吗?或者直接由udp的查找表输出决定,为什么specify中会赋x?
if(E==1'b0 && SE==1'b0)
(posedge CK=>(ECK:1'bx))=(a,b)
回复 jake 2022-4-13 10:55
ceerqingting: jake, 看到ICG cell的specify中有如下的指定,没想明白为什么?此时不应该是0吗?或者直接由udp的查找表输出决定,为什么specify中会赋x?
if(E==1'b0 && SE==1'b ...
这里的specify并不是把ECK赋值为1'bx.
根据 Verilog LRM (language reference manual), 14.2.3 Edge-sensitive paths, 这一句的完整解释应该是这样的:
edge_identifier  input_terminal  => (output terminal :  data_source_expression )
这里 data_source_expression 为 1'bx,应该是无所谓的意思。
回复 ceerqingting 2022-4-13 14:31
jake: 这里的specify并不是把ECK赋值为1'bx.
根据 Verilog LRM (language reference manual), 14.2.3 Edge-sensitive paths, 这一句的完整解释应该是这样的:
edge_i ...
好的,那是我理解有误,谢谢纠正。
现在实际后仿中遇到一个问题是CG cell的clk_in在开始都是0,E和SE都是0,clk_out一直输出x态(这个感觉不合理),后面等rst释放之后,由于clk_out是x态,导致q端输出x, q端的输出反馈到icg的E端导致clk_out持续的x态,最终x态传播出去,目前做法是通过$deposit给ICG的clk_out一个确定态,但是始终不明白为什么CG的clk out会出x态
回复 jake 2022-4-13 21:04
ceerqingting: 好的,那是我理解有误,谢谢纠正。
现在实际后仿中遇到一个问题是CG cell的clk_in在开始都是0,E和SE都是0,clk_out一直输出x态(这个感觉不合理),后面等rst释放 ...
"现在实际后仿中遇到一个问题是CG cell的clk_in在开始都是0,E和SE都是0,clk_out一直输出x态(这个感觉不合理)" -- 你观察到的这个现象非常重要。 ICG如果没有初始化过,里面的latch状态为x, 输出为x。
我感觉你选的这个ICG可能有些问题。如果是时钟低电平 E|SE 通过的那种ICG, 初始clk_in为0,ICG是可以正确初始化的。 感觉你选的是时钟高电平 E|SE 通过的那种,所以clk_in为0没能初始化。
回复 ceerqingting 2022-4-14 09:58
jake: "现在实际后仿中遇到一个问题是CG cell的clk_in在开始都是0,E和SE都是0,clk_out一直输出x态(这个感觉不合理)" -- 你观察到的这个现象非常重要。 ICG ...
jake,您的推断是正确的,ICG确实是高电平时,E和SE透明传输,所以导致latch没有初始化一直为x态,昨天看了您跟另外一位坛友关于ICG 后仿x态的互动,受益匪浅,感觉很多问题原来无解想不明白,现在都逐渐清晰啦,谢谢您!
另外还想请教的是关于latch未初始化导致的x态仅仅是一个仿真issue吗?在silicion上会不会真的有问题?个人认为对于一开始就工作的电路是不是还是有影响,比如对于counter有可能导致少一个期望的edge,导致fail?
回复 jake 2022-4-14 10:41
ceerqingting: jake,您的推断是正确的,ICG确实是高电平时,E和SE透明传输,所以导致latch没有初始化一直为x态,昨天看了您跟另外一位坛友关于ICG 后仿x态的互动,受益匪浅,感 ...
这个ICG未初始化问题是真实存在silicon中的。真实silicon里的latch上电后可能是1可能是0。 几十个片子放在一起测,可能大部分能正常启动,有几个启动就乱了。 这种不一致的行为用户是无法接受的。
回复 ceerqingting 2022-4-14 14:01
jake: 这个ICG未初始化问题是真实存在silicon中的。真实silicon里的latch上电后可能是1可能是0。 几十个片子放在一起测,可能大部分能正常启动,有几个启动就乱了。 这 ...
了解,非常感谢!
那对于这种latch未初始化的情况好像也很难避免掉,除非能够保证在reset release之前clk上有toggle,但是貌似很难。因为目前看到的现象是ICG串联,前级ICG是disable的,所以clk_out一直是0,但是后级ICG是高电平透明传输,所以没有初始化,导致x态
回复 Tony0229 2022-7-2 16:45
这个有点牛了,学习了
回复 zya1314125 2022-11-16 09:50
jake: 应该不需要create_generated_clock。切换并没有改变时钟的频率,相位。工具能看到的时两个异步时钟穿过MUX。从工具的角度看,两个异步时钟路径共享一个MUX。后续 ...
假设两个异步clk是logic_exclusive,or之后变成physical_exclusive。还是需要generated clock的吧,猜测SI分析会不一样
12

facelist

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

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 1

    关注
  • 228

    粉丝
  • 89

    好友
  • 285

    获赞
  • 273

    评论
  • 2311

    访问数
关闭

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

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

GMT+8, 2024-5-2 00:26 , Processed in 0.020389 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部