首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【Vivado使用误区与进阶】XDC约束技巧——CDC篇-2

【Vivado使用误区与进阶】XDC约束技巧——CDC篇-2

用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 。

        set_max_delay -from [get_cells …../rd_pntr_gc_reg
  • ] -to [get_cells …../Q_reg_reg
  • ] \
                                     -datapath_only [get_property PERIOD $rd_clock]
            set_max_delay -from [get_cells …../wr_pntr_gc_reg
  • ] -to [get_cells …../Q_reg_reg
  • ] \
                                     -datapath_only [get_property PERIOD $wr_clock]
    自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_cells a/b/c/*_sync*]
    ● 优势:灵活、针对性好、便于时序分析和调试。
    ● 劣势:1) 逐条约束会占用大量时间来调试和分析,效率低下。2) 时序例外的优先级比较复杂,多种时序例外约束共存的情况下,很容易产生意想不到的冲突,进一步增加调试时间,降低效率。3) 这么做极容易产生臃肿的XDC约束文件,而且时序例外的执行更耗内存,直接导致工具运行时间变长。
    小结
    CDC路径的分析和约束不仅在FPGA设计中至关重要,也是数字电路设计领域一个非常重要的命题。IP提供商、EDA公司都有不少关于CDC的技术文档。Vivado相比于Xilinx.上一代产品ISE,已经在CDC的鉴别和分析方面有了很大改进,XDC相比于UCF,在CDC路径的约束上也更为高效,覆盖率更高。
  • 返回列表