
目录1. 跨时钟域时序违例问题2. 使用方法1. 跨时钟域时序违例问题跨时钟域设计CDC是个老生常谈的问题其场景很多很杂其中一个比较为人熟知的就是单bit信号从慢时钟到快时钟所采用的两级寄存器处理的场景俗称打两拍打两拍可以有效的减少亚稳态的发生的概率。比如下面的电路就是一个典型的打两拍电路在布局布线过程中我们当然希望用来做CDC的两个寄存器可以尽量放在一起这样可以减少寄存器之间的时延从而增大MTBF提高系统的稳定性。但是天不遂人愿综合工具vivado在某些情况比如资源使用较多的情况下可能并不会这么智能两个寄存器往往放置不到一起。这时我们就可以使用vivado的提供的综合属性----ASYNC_REG 来解决这一问题。ASYNC_REG 属性一般用于跨时钟域的数据同步上该属性指定该寄存器可以接收异步数据该寄存器是一个位于同步链上的同步寄存器在执行仿真时若发生时序违例则寄存器的默认行为是输出X或不定态这可能引发在多个路径上传输不定态。在这种情况下所有器件的输入会变成X而自身则会变成不定态。这一情况会顺着设计链条传播从而使设计的大部分或全部都进入不定态且无法自行恢复。ASYNC_REG能够使得在发生时许违例时输出上次的已知值从而解决这一问题。ASYNC_REG属性使得vivado在综合时不会将其自身或周边逻辑优化同时也通过影响优化、布局、布线的方式来提高MTBF。当应用了ASYNC_REG属性后vivado会尽可能地将同步上的同步寄存器放置在一起来提高MTBF。被设置了ASYNC_REG属性的同一组直接相连的寄存器会被布局到同一个SLICE/CLB中。2. 使用方法ASYNC_REG用于单bit信号采用双或多触发器实现异步跨时钟域的场合此时所有用于同步的触发器都要标记ASYNC_REG。标记方式为(* ASYNC_REG “TRUE” *) reg sync_0, sync_1;在定义寄存器 sync_0和sync_1的语句前面加上 (* ASYNC_REG “TRUE” *) 就可以了 “TURE” 表示应用了 ASYNC_REG 属性ASYNC_REG 的默认状态是 “FALSE”。目的是告诉综合工具布线时将这2个寄存器放在一起即同一个SLICE中从而减少线延迟对时序的影响。应用了该属性后综合工具就会把两个寄存器放置在一起了参考博客FPGA随记——VIVADO中ASYNC_REG指令对编译特性(* ASYNC_REG “TRUE” *)的理解