XDC约束技巧之CDC篇

上一篇《xdc 约束技巧之时钟篇》介绍了 xdc 的优势以及基本语法,详细说明了如何根据时钟结构和设计要求来创建合适的时钟约束。我们知道 xdc 与 ucf 的根本区别之一就是对跨时钟域路径(cdc)的缺省认识不同,那么碰到 fpga 设计中常见的 cdc 路径,到底应该怎么约束,在设计上又要注意些什么才能保证时序报告的准确性?
cdc的的定义与分类
cdc 是 clock domaincrossing 的简称,cdc 时序路径指的是起点和终点由不同时钟驱动的路径。在电路设计中对这些跨时钟域路径往往需要进行特别的处理来避免亚稳态的产生,例如使用简单同步器、握手电路或是 fifo 来隔离。
安全的cdc路径
所谓安全的 cdc 路径是指那些源时钟和目标时钟拥有相同的来源,在 fpga 内部共享部分时钟网络的时序路径。这里的安全指的是时钟之间的关系对 vivado来说是全透明可分析的。
不安全的cdc路径
不安全的 cdc 路径则表示源时钟和目标时钟不同,且由不同的端口进入 fpga,在芯片内部不共享时钟网络。这种情况下,vivado 的报告也只 是基于端口处创建的主时钟在约束文件中所描述的相位和频率关系来分析, 并不能代表时钟之间真实的关系。
在 vivado 中分析 cdc
在 ise 中想要快速定位那些需要关注的 cdc 路径并不容易,特别是要找到不安全的 cdc 时,因为 ise 缺省认为所有来源不同的时钟都不相关且不做分析,要报告出这类路径,需要使用 ise timing analyzer (trce) ,并加上 “-u” (表示 unconstrained)这个选项。
在 vivado 中则容易许多,我们可以使用report_clock_interaction 命令(gui 支持)来鉴别和报告设计中 所有的时钟关系。执行命令后会生成一个矩阵图,其中对角线上的路径表示源时钟与目标时钟相同的时钟内部路径,其余都是 cdc 路径。
vivado 还会根据网表和已读入的约束分析出 cdc 路径的约束情况,并分颜色表示。例如绿色代表有时序约束,红色代表不安全的 cdc 路径但是没有约束时序例外,橙色表示有部分路径已约束为 false path 的不安 全 cdc 路径。
矩阵下方是时钟关系表格,可以就各种条件进行筛选和排序,方便定位 cdc 路径。建议的做法是:首先,对“common primary clock”排序(显示为 yes 或 no),这么做可以快速鉴别出那些安全和不安全的 cdc 路径,接着观察对应的“inter-clock constraints”栏内的内容,判断已读入的xdc 中是否对这类路径进行了合理的约束。
第二步,可以对“path req (wns)”由小到大进行排序,找到那些数值特别小(例如小于 100ps)或是显示 为“unexpanded”的 cdc 路径,结合是否共享“commonprimary clock”来鉴别此类路径,作出合理的约束。
过小的 path req (wns)一般都表示此类跨时钟域路径缺少异步时钟关系或其它时序例外的约束,如果两 个时钟连“common primary clock”也不共享,则 100%可以确认为异步时钟,应该加上相应的时钟关系约束。
显示为“unexpanded”的时钟关系,表示 vivado 在一定长度(缺省为 1000)的周期内都没有为两个时钟的频率和相位找到固定的关系,则无法推导出相应的 path req 约束值。此类 cdc 需要特别留意,也要加上异 步时钟关系约束。
这个矩阵还支持交互式的时序分析,选中任意一个方框,右键显示下拉菜单:选择 report timing,会报 告出这一格代表的时钟域(本时钟域或是跨时钟域)内最差的时序路径;选择set clock groups 则可以设置时钟关系约束并添加到 xdc 文件中。
cdc 的设计与约束
cdc 路径在 fpga 设计中普遍存在,在设置 相应的约束前,必须了解设计中采取了怎样的方法来处理跨时钟域路径。
简单同步器
对于单根跨时钟域路径,一般采用简单同步器(simple synchronizer),就是由至少两级 ce 端 和 reset/clear 端接死的寄存器序列来处理。
这种情况下,为了更长的平均无故障时间 mtbf(mean time between failures),需要配合一个 async_reg的约束,把用作简单同步器的多个寄存器放入同一个 slice,以降低走线延时的不一致和不确定性。
set_property async_reg true [get_cells [list sync0_reg sync1_reg]]  
在 xdc 中,对于此类设计的 cdc 路径,可以采用 set_clock_groups 来约束。
用 fifo 隔离 cdc
在总线跨时钟域的设计中,通常会使用异步 fifo 来隔离。根据 fifo 的实现方式不同,需要加入不同的 xdc 约束。
build-in 硬核 fifo
这种 fifo 实际上就是用 fpga 内部的 bram 来搭建,所有控制逻辑都在 bram 内部,是推荐的 fifo 实现方式。其所需的 xdc 也相对简单,只要像上述简单同步器的时钟关系约束一样用 set_clock_groups 将读写时钟约束为异步即可。
带有格雷码控制的 fifo
为了在亚稳态下做读写指针抽样也能正确判断空满状态,设计中也常用一种带有格雷码控制的 fifo 来实现异步时钟域的隔离。计数器和读写指针等需要用 bram 外部的逻辑搭建,这样的结构就不能简单约束 set_clock_groups,还要考虑这些外部逻辑如何约束。
如下图所示 fifo,在存储器外部有一些用 fpga 逻辑搭建的写指针和读指针控制,分属不同的时钟域,存在跨时钟域的时序路径。
此时如果仅将读写时钟用 set_clock_groups 约束为异步时钟,相当于设置从 a 到 b 和从 b 到 a 的路径全部为 false path。根据《xdc 约束技巧之时钟篇》所列,false path 的优先级最高,很显然这么做会导致所有 跨读写时钟域的路径全部不做时序分析,读写指针和相关控制逻辑也就失去了存在的意义。
所以建议的做法是不设 set_clock_groups 约束,转而采用 set_max_delay 来约束这些跨时钟域路径。以写入侧举例,一个基本的原则就是约束从 cell1 到 cell2 的路径之间的延时等于或略小于 cell2 的驱动时钟一个周期的值。读出侧的约束同理。
set_max_delay $delay –from [get_cells cell1] –to [get_cells cell2] –datapath_only  
如果用户使用 vivado 的 ip catalog 来产生此类fifo,这样的 xdc 会随 ip 的源代码一起输出(如下所示),使用者仅需注意确保这个 fifo 的读写时钟域没有被用户自己的 xdc 约束为 false path 或是异步 clock groups 。
自 2013.4 开始,vivado 中还提供一个称作 methodology_checks 的 drc 检查,其中包含有对此类异步fifo 的 max delay 约束与时钟域 clock groups 约束的冲突检查。
cdc 约束方案的对比
cdc 路径在 fpga 设计中普遍存在,不少公司和研发人员都有自己偏爱的约束方式,这些方式通常有各自适用的环境,当然也各有利弊。
全部忽略的约束
最大化全部忽略 cdc 路径的约束,即采用 set_clock_groups 或是 set_false_path 对时钟关系进行约束, 从而对跨时钟域的路径全部忽略。
示例:set_clock_groups -asynchronous -group clka -group clkb
优势:简单、快速、执行效率高。
劣势:会掩盖时序报告中所有的跨时钟域路径,容易误伤,不利于时序分析。  
使用 datapath_only 约束
datapath_only 是从 ise 时代的 ucf 中继承过来的约束,在 xdc 中必须作为一个选项跟 set_max_delay 配合使用,可以约束在时钟之间,也可以对具体路径进行约束。
  示例:set_max_delay 10 -datapath_only -from clka -to clkb
  优势:简便、执行效率较高。
  劣势:1) 需要特别留意是否设置了过于严格的约束,因为使用者经常会使用较快的时钟周期来约束跨时钟域路径 。2) 注意约束优先级的关系,是否跟设计中其它的约束有冲突。3) set_max_delay 而没 有配套设置 set_min_delay 的情况下,同一路径只做 setup 分析而不做 hold 分析。
  逐条进行时序例外约束
对设计中的 cdc 路径分组或逐条分析,采用不同的时序例外约束,如 set_false_path,set_max_delay 和 set_multicycle_path 等来约束。
示例:set_false_path -from [get_cells a/b/c/*_meta*] -to [get_cellsa/b/c/*_sync*]
优势:灵活、针对性好、便于时序分析和调试。
劣势:1) 逐条约束会占用大量时间来调试和分析,效率低下。2) 时序例外的优先级比较复杂,多种时序例外约束共存的情况下,很容易产生意想不到的冲突,进一步增加调试时间,降低效率。3) 这么做极容易产生臃肿的 xdc 约束文件,而且时序例外的执行更耗内存,直接导致工具运行时间变长。
小结
cdc 路径的分析和约束不仅在fpga 设计中至关重要,也是数字电路设计领域一个非常重要的命题。ip 提供商、eda 公司都有不少关于 cdc 的技术文档。vivado 相比于 xilinx 上一代产品 ise,已经在 cdc 的鉴别和分析方面有了很大改进,xdc 相比于 ucf,在 cdc 路径的约束上也更为高效,覆盖率更高。
希望本篇短文可以帮助 vivado 的用户快速掌握对 fpga 设计中 cdc 路径的鉴别、分析和约束方法,提高设计效率。


7月25日快讯:财报上演/“棱镜门”后商机不断
一路走来 | 负责近百年历史的德国压铝机配套及改造的部分加热系统
UWB定位技术浅析
模块化LED灯的制作
用注射器作吸锡器
XDC约束技巧之CDC篇
直接耦合两级放大电路的直流分析和交流分析
用敷铜板修复电炒锅电源插座
变频挂机为何会产生忽大忽小的喘振声?
进击的中磊 中磊电子发表全系列LTE-M物联网终端
步进电机工作原理是什么?
双端口SRAM中读干扰问题,读干扰的原理分析
气敏传感器在信号采集中的应用
鸿蒙系统黄金搭档方舟编译器2.0:实现多语言多设备编译
从家博会到AWE的变化_AWE逆生长之谜的解开
DIY使用ESP32的手持游戏手柄并通过BLE进行通信的设计
NAB磁头前置放大器(OPA37)
Razer发布Naga Hex鼠标
高清在线监测装置 视频监视系统
自动驾驶汽车挂牌上路有待斟酌 暂仅用于测试