CDC(clock domain crossing)信号指的是从一个时钟域传递到另一个异步时钟域的信号,这两个时钟要么不同频率、要么同频不同相,当发送时钟的有效沿太过接近接收时钟的有效沿,那么发送数据在接收时钟沿的setup/hold时间内变化时,亚稳态Metastability就会发生,采样寄存器的输出将会进入不定态。

但是RTL simulation却无法监测到亚稳态的发生,尽管CDC工具、后仿真可以帮助发现亚稳态,但是最重要的还是RTL设计者在设计实现的时候便将各种CDC问题悉数人肉确认清楚。为了设计出可容忍亚稳态的电路,我们需要弄清楚CDC问题会在芯片里面如何呈现、会在前/后仿真时如何呈现。

如下图,假设信号s来自于一个异步于clk的时钟,那么s信号相对于DFF的clk上升沿而言可能在任何时刻发生变化。当s未能在DFF的setup/hold窗口内保持稳定的0或1,clk将会驱动DFF的输出q信号变为中间电压值并持续一段不确定的时间,然后DFF的输出q可能会随机的稳定为0或者1,这段时间即称之为亚稳态Metastability。

那么多长时间发生一次亚稳态呢?我们可用MTBF(mean-time-between-failure)来表示。MTBF,即平均无故障工作时间,英文全称是“Mean Time Between Failure”,是衡量一个产品(尤其是电器产品)的可靠性指标。单位为“小时”。它反映了产品的时间质量,是体现产品在规定时间内保持功能的一种能力。具体来说,是指相邻两次故障之间的平均工作时间,也称为平均故障间隔。MTBF计算公式如下,显然两个异步时钟频率越大、setup/hold时间窗越大,故障率越大。

为何RTL仿真时,EDA仿真工具无法发现亚稳态呢?因为RTL simulation时data path/clock path尚未完成物理绕线,是不具有延时信息的,EDA工具不会进行setup/hold检查,因为会按照如下规则进行仿真:

  • 异步信号在rx_clk上升沿之前变化,那么输出就在rx_clk之后发生变化。

  • 异步信号在rx_clk上升沿之后变化,那么输出就不发生变化。

    而芯片的实际情况是:

尽管异步cdc_s信号在rx_clk上升沿之前变化,但是若不满足setup时间,芯片hardware实际输出可能是如下两种的情况。

第一种情况是前仿真和芯片实际情况一致。

第二种情况是前仿真比芯片实际提前一拍。

尽管异步cdc_s信号在rx_clk上升沿之后变化,但是若不满足hold时间,芯片hardware实际输出可能是如下两种情况。

第一种情况是前仿真和芯片的实际输出情况一致。

第二种情况是前仿真比芯片实际晚输出一拍。

以上介绍了CDC问题会在前仿真时如何呈现、会在芯片里如何呈现,而且我们也知道前仿真是无法仿出来CDC问题的,并且前仿真和实际芯片可能存在提前一拍或者延后一拍的情况,会不会造成前仿真功能正确但实际芯片功能错误呢?

通过添加一个R3寄存器、MUX选择器,并且MUX的select端口接random随机值,也就是随机选择是否延迟一拍。插入该电路可在前仿真时模拟出CDC信号随机延后一拍的情况,但是无法模拟提前一拍的情况。

此外,还可通过加大clock jitter的办法来尝试模拟CDC信号采集的亚稳态现象,端到端的观察RTL仿真是否存在功能问题,但是加大clock jitter的方法也无法完全模拟出CDC亚稳态效果。

虽然CDC在前仿真无法发现,但是我们也没必要紧张,诸如spyglass、0in等CDC工具可以基本排查开所有异步问题(前提是好的代码风格),当然设计者对异步电路的掌握能力才是规避问题的第一关卡。

此外,异步信号应该和RX采集模块的逻辑解耦和,这样异步信号是早一拍、晚一拍也就不重要了。后续小编将持续介绍CDC的各种异步设计方法。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐