1、CDC定义与分类
\quad
CDC 是 Clock Domain Crossing 的简称, CDC 时序路径指的是起点和终点由不同时钟驱动的路径。在电路设计中对这些跨时钟域路径往往需要进行特别的处理来避免亚稳态的产生,例如使用简单同步器、 握手电路或是 FIFO 来隔离。
2、CDC设计与约束
2.1、简单的同步器
\quad
ASYNC_REG约束,把用作简单同步器的多个寄存器放入同一个SLICE,以降低走线延时的不一致和不确定。
\quad
约束命令如下:
\quad
set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]
\quad
(* ASYNC_REG=“true” *)reg A;
2.2、FIFO隔离CDC
\quad
总线跨时钟域通常用异步FIFO
1) Build_in 硬核fifo
\quad
这种fifo是直接用BRAM搭建的,也是推荐的fifo实现方式。所有的控制逻辑都在BRAM内。用set_clock_groups约束即可。
2) 带有格雷码控制的fifo
\quad
为了在亚稳态下做读写指针抽样也能正确判断空满状态,设计中也常用一种带有格雷码控制的FIFO来实现异步时钟域的隔离。计数器和读写指针等需要用 BRAM 外部的逻辑搭建,这样的结构就不能简单约束 set_clock_groups,还要考虑这些外部逻辑如何约束。
\quad 因为set_clock_groups相当于set_false_path,而set_false_path优先级最高,这样就导致所有跨读写时钟域的路径全部不做时序分析,读写指针和相关控制逻辑也就失去了存在的意义。
\quad 所以建议的做法是不设 set_clock_groups 约束, 转而采用 set_max_delay 来约束这些跨时钟域路径。以写入侧举例,一个基本的原则就是约束从 cell1 到 cell2 的路径之间的延时等于或略小于 cell2 的驱动时钟一个周期的值。 读出侧的约束同理。
\quad 约束命令:set_max_delay $delay –from [get_cells cell1] –to [get_cells cell2] –datapath_only
\quad 如果用户使用 Vivado 的 IP Catalog 来产生此类 FIFO,这样的 XDC 会随 IP 的源代码一起输出,使用者仅需注意确保这个 FIFO 的读写时钟域没有被用户自己的XDC 约束为 false path 或是异步 clock groups 。
3、CDC约束方案对比
1) 全部忽略的约束
\quad
set_clock_groups
\quad
简单、省时、效率高。但容易误伤。
2) 使用datapath_only约束
\quad
set_max_delay
\quad
简单、效率高。但约束必须合理,不能过紧也不能过松,要注意约束冲突。
3) 逐条进行时序例外约束
\quad
set_false_path、set_max_delay、set_min_delay、set_multicycle_path
\quad
灵活、针对性好、便于时序分析和调试。但效率低下,容易冲突。