1 引言
在一般的ASIC教程中,大家接触的大都是同步时序的设计,即单时钟的设计。但在实际工程中,纯粹单时钟设计的情况很少,特别是在设计模块与外围芯片的通讯中,跨时钟域的情况经常不可避免。作者在实际工作中常遇到一些异步时序设计的问题,由于最初对异步时序产生的问题估计不足,导致在设计后期不得不进行返工。本文介绍的几种同步策略是在实践中学习摸索的结果。当然,这几种同步方法不可能完全覆盖异步时序设计所涉及的问题。由于篇幅所限,本文主要描述同步策略的核心思想,而不涉及具体的实现。
2 问题的产生-亚稳态
2.1 异步时序的定义
异步时序设计指的是在设计中有两个或两个以上的时钟,且时钟之间是同频不同相或不同频率的关系。而异步时序设计的关键就是把数据或控制信号正确地进行跨时钟域传输。
2.2 亚稳态
每一个触发器都有其规定的建立和保持时间参数,在这个时间参数内,输入信号在时钟的上升沿是不允许发生变化的。如果在信号的建立时间中对其进行采样,得到的结果将是不可预知的,即亚稳态。我们还可以从图1来理解亚稳态问题。触发器中包含两个双稳态元件(如S-R锁存器),其特性曲线如图1所示。除了两个稳定的状态(0和1)以外,令人吃惊的是,还有一个状态也满足双稳态元件的方程,这个状态既不是0状态,也不是1状态,也就是我们所说的亚稳态。
下面从触发器的物理特性方面对亚稳态进行描述。触发器进入亚稳态的时间可以用参数MTBF(mean time between failures)来描述,MTBF即触发器采样失败的时间间隔,其计算公式为:
MTBF="e"(tr/τ) /T0f a
式中,tr为分辨时间(从时钟沿开始),τ、T0为触发器参数,f是采样时钟频率,a为异步事件触发的频率。
对于典型的0.25μm工艺ASIC库中的一个触发器,取以下参数:
tr="213ns", τ=0.31ns, T0=9.6as,
f="100MHz", a="10MHz", MTBF="2".01d
即触发器每两天便可能出现一次亚稳态。
由上面的推导可知,一个信号(a—clk)在过渡到另一个时钟域(b—clk)时,如果仅仅用一个触发器将其锁存,那么用b—clk进行采样的结果将可能是亚稳态。这也是信号在跨时钟域时应该注意的问题。
3 同步策略1—双锁存器法
为了避免上述亚稳态问题,就应当使参数MTBF尽可能的大,通常采用的方法是双锁存器法,即在一个信号进入另一个时钟域之前,将该信号用两个锁存器连续锁存两次,最后得到的采样结果就可以消除亚稳态问题,如图2所示。

当使用了双锁存器以后,b—dat2的MTBF可由下式得出:
MTBF=e(tr/T)/T0fa×e(tr/τ)/T0f
如果我们仍然使用上一节所提供的参数,则b—dat2的MTBF为9.57×109(years)。由上述结果可以看出,双锁存器法可以消除亚稳态问题。
4 同步策略2—结绳法
细心的读者也许会发现,在上面的例子中,如果a—clk的频率比b—clk频率高,可能会出现因为dat变化太快而使b—clk无法采到的问题。即在信号从快时钟域向慢时钟域过渡的时候,如果信号变化太快,慢时钟将可能无法对该信号进行正确采样。所以,在使用双锁存器法的时候,应该使原始信号保持足够长的时间,以便另一个时钟域的锁存器可以正确地对其进行采样。针对上述问题,介绍一种安全的跨时钟域方法:结绳法,如图3所示。因为“结绳法”适合任何时钟域的过渡(clk1和clk2的频率和相位关系可以任意选定),所以没有标明两个时钟坐标。
