怎么设计一个Gfree mux电路
在数字电路的设计中,凡是碰到时钟的电路设计都是十分小心的,最怕时钟出现glitch,这种情况下,容易导致timing fail,或者传播亚稳态。
因此常见的做法都是在切时钟的时候把输出clk给暂停几个cycle,这样也仅仅是降低了performance。
循着这样的思路,我们可以设计一个Gfree Mux电路,即在两个clk切换之间设计反馈电路,只有当一个clk的输出暂停以后才去操作另外的一个clk。
(代码从本文末的阅读原文访问)
具体设计如下图所示:
这个图中的sync unit就是同步单元,其中包含了多级同步器,一般是由特定的同步DFF组成。由图中可以看出,只有当一个clk的ICG关闭以后,反馈信号才会同步到另外一个clk path的操作上,这样导致的后果就是,在两个clk切换之间会导致比较大的时钟停摆。
仿真结果如下图所示。
因为最终输出的clk out仅仅是将两个clk的输出进行或操作,理论上组合逻辑是很容易出现毛刺glitch的,因此此处能够保证不出glitch的秘诀是使用了ICG模块,因为ICG中包含有低电平触发的latch,只有当时钟为低电平时,才会起作用,保证了clk out的输出是正常的。
另外一个问题,这个电路为什么要多使用一级DFF,然后将输出再反馈给另一条path呢?能不能直接使用Sync Unit的输出反馈给另一条path呢?理论上,这个是存在风险的,在比较极端的情况下,一个clock和另一个clock之间的周期相差很大,那么就有可能存在一个clock还没被gating住,另外一个clock已经打开,这时就会导致glitch。
那么上述电路中,一次时钟切换会导致多久的clock 停摆呢?
假设原来的clk是clock0,理论上停摆时间是,需要先保证原有的clock0被gating,然后通过一级DFF传给clock1,那么需要1个clock0的cycle,然后将这个信号传输给Clock1的ICG,需要2到3个clock穿过Sync Unit,这个看实际工作频率和用户设置。以3个clock的Sync Unit为例,则最长需要1 clock0和3 clock1的时钟停摆,当然时钟之间存在skew,所以可能比这个稍微短点。
当然,在数字电路设计中,不仅仅只有上面这种方式设计gfree mux电路,面试笔试中最常见的方式则是以前提到的下面这个方式。
时钟切换中的glitch
时钟切换方式千万条,谨记无glitch是第一条。