首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

IC设计基础系列之CDC篇2:clock domain crossing(CDC) (二 跨时钟域设计的潜在问题)

IC设计基础系列之CDC篇2:clock domain crossing(CDC) (二 跨时钟域设计的潜在问题)

一般来讲,如果设计中存在有多个时钟域,那么就必然会存在跨时钟域的timing path。如果对跨时钟域的timing path处理不当,则容易导致亚稳态,glitch,多路扇出,重新聚合等等问题,导致设计不能稳定工作或者就根本不能正常工作。

1. 亚稳态
对时序逻辑电路来说,一个DFF的输入信号必须在该DFF的时钟沿前后一段时间内都保持稳定才能保证DFF能锁存到正确的值。这既我们所说的setup time和hold time,其中信号在时钟沿之前的保持时间为setup time,信号在时钟沿之后的保持时间为hold time。正常情况下,如果DFF的输入能满足setup time和hold time的要求,那么在tCO(the clock to output delay)时间内DFF的输出就会达到一个有效的逻辑值(高电平或者低电平)。否则,DFF的输出就需要远大于tCO的时间来达到有效的逻辑值,这段时间内,DFF的输出信号是不稳定的,被称为不稳定状态,或者叫亚稳态。如果CLK B在DA变化的时候来对DA进行采样,那么DB就会出现亚稳态。

对于同时钟域的信号。无论是在ASIC设计还是在FPGA设计中,我们也可以方便的通过STA来保证同时钟域的信号能满足setup/hold time的要求,不会出现亚稳态的问题。
但对于异步信号,相位关系是完全不可控的,而且会随时间发生变化,这就必然会存在亚稳态的问题,而且STA工具也没有办法对不同时钟域之间的timing path进行分析。也就是说,我们是没有办法完全避免异步信号之间的亚稳态问题的,但是可以通过在跨时钟域的信号上加入一些特殊的电路来减少亚稳态问题对电路功能所产生的负面影响。

2. Glitch
前面我们讲过,STA工具室不会对跨时钟域的信号做STA。跨时钟域的信号很容易产生glitch并最终影响电路功能。如下图中,CLKA domain中,DA1和DA2分别为两个DFF的输出,理想状态下,DA1和DA2到达与门两个输入端的时间是一样的,这样设计就不会出问题。但由于后端布局,环境等等因素导致的传播延迟Td会使A&B存在一个Glitch。而由于CLKB和CLKA为两个clock domain,之间不存在固定的相位关系,假设这个Glitch恰好被CLKB锁存住,那么就会在DB2生成一个有效的高电平信号,这个高电平信号不是我们的设计所期望的,那就会导致后继的电路功能出现问题
也有可能是下面的情况,因为Td的影响,导致本应该传递到CLKB的高电平信号没有被传递过去,从而导致后继电路的功能出现问题。





在实际系统中,如果没有处理好跨时钟域的信号,那么由此导致的问题是很容易出现的。我在做silicon debug的时候,曾经多次遇到过由CDC导致的问题。由CDC导致的问题,在实际系统上的表现并不是非常一致,但经常表现出来的就是设计时而可以正常工作,时而出错,而且出错的概率不尽相同,这对问题的分析解决是非常不利的。我曾经遇到过一个CDC导致问题,需要执行数千次的操作,才可能复现出来,但问题一出现就是致命的,会导致系统出错。由于非常难复现问题,分析解决起来就特别困难。所以我们在做设计的时候,要尽量从一开始就解决掉这些问题
3 多路扇出
如果信号从一个时钟域分多路进入另外一个时钟域,那么很有可能会导致功能上的错误。如下图所示,由于Td的存在,DA1和DA2到达CLKB的时间不同,最终导致fsm1_en和fsm2_en这两个本应该同时有效的信号实际上相差一个CLKB的周期。这很可能会影响到后继的电路功能。





l 重新聚合
如果多个信号从一个时钟域进入另外一个时钟域,然后这些信号在目标时钟域中又聚合到一起,那么就有可能因为信号的重新聚合导致电路功能上的异常。
原本EN1和EN2转换时钟域后,期望得到的值是2’b00和2’b11,但由于EN1和EN2到达CLKB时钟域的时间有差异,实际得到的值是2’b00,2’b10和
2’b11,最终导致后继电路功能出现问题。
返回列表