0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么CDC是问题?常用的CDC设计思路

冬至子 来源:数字逻辑电路小站 作者:孟祥志 2023-06-27 16:41 次阅读

CDC(Clock Domain Crossing,时钟穿越)有很多的论文都讨论过这个主题。本文主要从原理上分析一下为什么CDC是问题、常用的CDC设计思路。不能算权威总结,只是对工作几年CDC设计的经验的一个总结。

源起:建立时间和保持时间

集成电路设计专业的同学期末考试肯定考过“setup time"或者”hold time"的定义,这个也是应届毕业生面试数字集成电路设计岗位的“明牌”必面题目。

先回顾一下setup time(建立时间)和hold time (保持时间)的定义:

建立时间(t su ) 是在时钟翻转(对于正沿触发寄存器为0→1的翻转)之前数据输入(D)必须有效的时间。

维持时间(t hold )是在时钟边沿之后数据输入必须仍然有效的时间。

对于单一时钟的电路进行 时序分析 ,最主要是为了满足这些条件。

比如,说你的设计时序“很紧张”,往往是两级寄存器之间的组合逻辑很多,延时很长。从上一级的数据传到下一级时,无法满足下一级的建立时间。我们这个时候需要做时序修复(timing fix)。

单时钟这个问题比较好考虑,因为数据什么时候开始发送是明确的——上一个时钟沿——我们能够有很多办法去修复时序。(比如前文推送的“模板”)

但对于多时钟设计(异步电路),从一个时钟域向另一个时钟域送数据,时钟(周期)不同,在一个时钟域随时随刻都可能收到另外时钟域的数据,这自然是不能满足建立时间的。

不满足建立时间,那么数据的传输就会失败。何谓“失败”?就是我想传一个数据1过去,我可能成功的传了个1,也可能传了个0,也可能我不知道传了什么值。

不满足建立时间,简单的理解就是:目标时钟域(dest. clock) 的时钟沿和发起时钟域的数据(src. clock)来的时间 很接近 ,而时钟沿和数据的谁先谁后错开一点,传输到下一级的数据就是完全不一样,这种不同这是不可接受的。

因为不满足建立时间,我的数据是不的、不可预知的、不精确的。对于单个寄存器而言,我们叫做 亚稳态 (Metastability)。

总结一下: 在数据从一个时钟域向另一个时钟域传输时,无法满足建立时间,数据在被目标时钟域寄存器采值时,会进入亚稳态,无法准确传输数据

我们用 时钟穿越 (CDC,Clock Domain Crossing)来描述我们现在处理的这种情况。把所有的这种问题都叫做 时钟穿越问题 (CDC issue)。

随着工艺技术的迭代,很多的公司的集成电路项目出现错误,都是出现在CDC的解决方法有问题,或者验证不够充分上。

本章节先讨论1比特的情况。

那如何解决“1bit的时钟穿越”问题呢?

既然根子上是亚稳态的问题,那我就破掉亚稳态

破掉亚稳态有很多种方法,方法都是让数据来到目标时钟域的时钟沿之前稳定住。

延长源信号的方法(不推荐):

我要传输1,那我就在源时钟域对信号1持续上拉;我要传输0,那我就在源时钟域对信号0持续下拉。换句话说,就是让想传的数据1和0都维持“ 足够长 ”的时间——长到我这个时钟沿采不到,下个时钟沿肯定能采到。

这就是我们看很多年前"老代码"中很普遍的方法:延长源信号长度。比如对源信号连续打多少拍,然后“或”起来组成一个信号使用。

或者干脆不做任何处理直接穿越,前提是能够证明虽然这个信号是一个CDC信号,但是不会轻易改变(比如寄存器初始化之后的一个控制信号,只会在初始化阶段改变)。

延长源信号方法总结:

  1. 很多老的设计是直接CDC使用,或者打多拍然后进行传输。

  2. 优点:简单,逻辑比较少

  3. 缺点:

    3.1.如果源信号的 前提假设发生变化 ,容易出现bug。如第二代设计的时钟频率比变化,或者一个不轻易改变的配置信号(control signal)“与”上了一个经常变的控制信号。不经过仔细验证,维持原有设计,很容易出“大“问题。

    3.2.逻辑虽然简单,但是设计不具有通用性。比如你需要对不同时钟频率比例的进行不同的打拍。

  4. 所有可以用“延长源信号”方法的地方,都可以加上同步器(syncer)逻辑 ,这更加保险。

  5. 总结:除非维护不好修改的历史代码,新代码不推荐。

同步器(synchronizer, syncer)

那破掉亚稳态还有什么办法呢?

方法很简单,就是在目标时钟域 加速稳定过程

D触发器是一个简单的加速稳定的简单结构。虽然1级D触发器,可能不满足建立时间,但是后面再跟一个D触发器,就会 使不稳态要么迅速变化为传输0,要么迅速变化为传输1

两级D触发器的串联,就是一个简单的同步器(synchronizer, 或者syncer,或者Sync2D)。

A synchronizer is a device that samples an asynchronous signal and outputs a version of the signal that has transitions synchronized to a local or sample clock."

这种稳定是概率性的,与工艺相关的。稳定下来而不是处于亚稳态的时间,有数学上的MTBF(平均失败时间)公式进行计算。在日常的设计中,一般工艺厂会告知你的一个参数公式(或者是一个查找表),输入你的输入输出频率,就能查找到在当前工艺下的MTBF,然后比对MTBF的要求决定是不是选择SYNC2D(打两拍的同步器)。

如果SYNC2D不满足MTBF的要求,那么就再接一级D触发器,组成SYNC3D(打三拍的同步器)。SYNC3D的MTBF比SYNC2D会长许多数量级。(我在前东家做一个设计,同样的时钟频率,查MTBF表SYCN2D的MTBF是10天,SYNC3D的平均失败时间是50年……)

我在过去做14nm工艺下的设计,项目主管就要求所有的SYNC2D替换为SYNC3D。

我们这里暂时用SYNC2D作为例子(SYNC3D同理)。

图片

同步器有什么好处?

能够安全的排除亚稳态。

同步器有什么坏处或者局限?

目的时钟域会晚几个周期。

这个不算是个问题,既然是跨时钟域的,晚两三个周期没什么问题。

** 数据传过来,对SYNC2D而言,会delay2个周期或者3个周期。** 也就是说你不能确定是2个周期后还是3个周期后能传过目标数据来。对于单比特没有问题,对于多比特存在对齐的问题。 同步器 只能保证数据没有亚稳态,不能保证是正确数据

怎么理解呢?就是说,你给我同步器什么数据,我都能给你住。但是 你若给我的是错误的值,这不能怨我

例如,在这个周期给同步器输入端一个信号1,同步器在能给你稳到0或者1,你只要在发送端的下个周期还给同步器1就好了。经过同步器一走,给个干净的1给你。

1.jpg

同步器的正确前提是,信号必须稳定足够长的时间(能够持续上拉,或者下拉)。

那么多长算长呢?前人理论已经有了研究结论了。在同步器设计理论中,叫做”1.5x规则“或者”三沿规则“: 输入端的信号长度,至少是1.5倍接收时钟周期的长度,或者三个接收时钟沿的长度

满足了这个规则,因为是三个边沿,那么肯定会有一个安全的上升沿可以采到。

这是非常重要的一个规则。只要满足了这一规则,同步器就是安全的。

使用同步器本身,可能会漏采或者多采。

其实这只是上一个要点的延伸。同步器是一个稳定单元,只能做到”稳“,你需要“稳+准”,这超出了同步器的能力范围,需要加上一些配合电路才能工作。但几乎所有的CDC电路在时钟穿越的核心逻辑,同步器都包含其中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117723
  • D触发器
    +关注

    关注

    2

    文章

    147

    浏览量

    47381
  • CDC
    CDC
    +关注

    关注

    0

    文章

    55

    浏览量

    17671
  • 同步器
    +关注

    关注

    1

    文章

    78

    浏览量

    14489
  • 时钟电路
    +关注

    关注

    10

    文章

    230

    浏览量

    50349
收藏 人收藏

    评论

    相关推荐

    FPGA User Guide之report_cdc

    report_cdc 可以报告设计中所有的 cdc 路径并将其分类(前提是时钟被约束好),我们可以基于该报告来检查设计中是否有不安全的 cdc 路径。
    发表于 11-28 10:53 1025次阅读

    USB复合设备MSC+CDC,CDC_Transmit_FS函数发送不正常的原因?

    单独测试CDC、MSC功能均正常,实现MSC+CDC复合设备后,均可正常识别到,但CDC_Transmit_FS函数不正常,现象如下: 1、在主循环里调用CDC_Transmit_FS
    发表于 03-13 07:40

    cdc_acm类设备与主机建立通信问题

    USB设备定义成cdc_acm类并与linux主机枚举成功后,在未进行数据传输时出现此信息:cdc_acm:failed to set dtr/rts有知道这是什么引起的吗?求思路,拜谢大家了
    发表于 12-20 08:45

    infosphere CDC性能调优的文档

    infosphere CDC性能调优的文档
    发表于 09-07 09:30 7次下载
    infosphere <b class='flag-5'>CDC</b>性能调优的文档

    08 CDC设备

    08 CDC设备
    发表于 10-11 09:17 9次下载
    08 <b class='flag-5'>CDC</b>设备

    火币为什么要停止CDC交易

    一石激起千层浪,火币公告发出之后迅速引发连锁反应,先是ZB交易所紧随其后关闭CDC交易,紧接着CDC项目负责人杨宁迅速接受媒体采访,倒苦水撇清关系。更多媒体开始深挖,CDC更多内幕也被披露出来。广大群众这才知道,原来
    发表于 11-08 11:33 6339次阅读

    如何使用report_cdc命令分析、调试和修复CDC问题

    了解如何使用命令report_cdc分析,调试和修复设计中的CDC问题。 命令report_cdc是一个仅限TCL的命令,用于分析您的设计并识别设计中潜在的CDC结构问题并将其标记为
    的头像 发表于 11-21 06:05 4316次阅读

    AN-1301:用CDC控制进样运动

    AN-1301:用CDC控制进样运动
    发表于 04-24 12:35 8次下载
    AN-1301:用<b class='flag-5'>CDC</b>控制进样运动

    vc++-CDC常用函数总结

    vc++-CDC常用函数总结(电源技术论坛)-该文档为vc++-CDC常用函数总结讲解文档,是一份还算不错的参考文档,感兴趣的可以下载看看,,,,,,,,,,,,,,,,,
    发表于 09-27 15:40 2次下载
    vc++-<b class='flag-5'>CDC</b><b class='flag-5'>常用</b>函数总结

    STM32 USB如何配置多个CDC设备—5个CDC设备

    title: STM32 USB如何配置多个CDC设备—5个CDC设备,date: 2021/1/18 20:10:25 +8,STM32 USB如何配置多个CDC设备—5个CDC设备
    发表于 12-28 19:43 30次下载
    STM32 USB如何配置多个<b class='flag-5'>CDC</b>设备—5个<b class='flag-5'>CDC</b>设备

    各种类型CDC路径中的毛刺问题

    CDC 验证不仅在 RTL 有必要,在门级也必不可少。在 RTL,重点是通过识别 CDC 结构和方案来确定时钟域和 CDC 路径。
    的头像 发表于 03-30 11:03 874次阅读

    HD74CDC2510B 数据表

    HD74CDC2510B 数据表
    发表于 05-08 19:08 0次下载
    HD74<b class='flag-5'>CDC</b>2510B 数据表

    CDC跨时钟域处理及相应的时序约束

    CDC(Clock Domain Conversion)跨时钟域分单bit和多bit传输
    的头像 发表于 06-21 14:59 1078次阅读

    HD74CDC2509B 数据表

    HD74CDC2509B 数据表
    发表于 06-27 18:49 0次下载
    HD74<b class='flag-5'>CDC</b>2509B 数据表

    HD74CDC2510B 数据表

    HD74CDC2510B 数据表
    发表于 06-27 18:49 0次下载
    HD74<b class='flag-5'>CDC</b>2510B 数据表