FPGA随记——VIVADO中ASYNC_REG指令

参考文章:Vivado综合属性系列一、ASYNC_REG_asyncreg=true-CSDN博客 -很棒棒的

跨时钟域设计(CDC)是个老生常谈的问题,其场景很多很杂,其中一个比较为人熟知的就是单bit信号从慢时钟到快时钟所采用的两级寄存器处理的场景,俗称"打两拍",打两拍可以有效的减少亚稳态的发生的概率。

比如下面的电路就是一个典型的打两拍电路:

发送端的信号是时钟域1的信号,而接受端的时钟则是时钟域2,两者为异步信号,发送端的异步输入信号被接受端采用两级寄存器采样的方式做了跨时钟域处理。

在布局布线过程中,我们当然希望用来做CDC的两个寄存器可以尽量放在一起,这样可以减少寄存器之间的时延,从而增大MTBF,提高系统的稳定性。但是天不遂人愿,综合工具(vivado)在某些情况(比如资源使用较多的情况)下可能并不会这么智能,两个寄存器往往放置不到一起。

这时我们就可以使用vivado的提供的综合属性----ASYNC_REG 来解决这一问题。

ASYNC_REG 属性一般用于跨时钟域的数据同步上,该属性指定:

  • 该寄存器可以接收异步数据
  • 该寄存器是一个位于同步链上的同步寄存器

在执行仿真时,若发生时序违例,则寄存器的默认行为是输出X或不定态,这可能引发在多个路径上传输不定态。在这种情况下,所有器件的输入会变成"X",而自身则会变成不定态。这一情况会顺着设计链条传播,从而使设计的大部分或全部都进入不定态,且无法自行恢复。ASYNC_REG能够使得在发生时许违例时输出上次的已知值,从而解决这一问题。

ASYNC_REG属性使得vivado在综合时不会将其自身或周边逻辑优化,同时也通过影响优化、布局、布线的方式来提高MTBF。当应用了ASYNC_REG属性后,vivado会尽可能地将同步上的同步寄存器放置在一起来提高MTBF。被设置了ASYNC_REG属性的同一组直接相连的寄存器会被布局到 同一个SLICE/CLB。

ASYNC_REG属性可以用在RTL代码或XDC约束两个阶段。下面是一个RTL中使用的例子:

在定义寄存器 sync_0和sync_1的语句前面加上 (* ASYNC_REG = "TRUE" *) 就可以了 ,"TURE" 表示应用了 ASYNC_REG 属性,ASYNC_REG 的默认状态是 "FALSE"。

应用了该属性后,综合工具就会把两个寄存器放置在一起了:

在XDC中约束这样写:

ASYNC_REG本质上是一个"优化向"的属性,它的作用是告诉综合工具vivado----被其标记的寄存器可以接收异步信号,且这些寄存器都是一个同步链上的同步寄存器,所以需要将其放置的尽可能靠近----也就是同一个SLICE/CLB,这样可以减少时延、有效提高MTBF。

相关推荐
希言自然也4 小时前
FPGA 时序分析(一)
fpga开发
I'm a winner9 小时前
基于FPGA的情绪感知系统设计方案:心理健康监测应用(一)
fpga开发·前沿研究
嵌入式-老费19 小时前
Zynq开发实践(Verilog、仿真、FPGA和芯片设计)
fpga开发
hahaha60161 天前
pcie实现虚拟串口
stm32·单片机·fpga开发
9527华安1 天前
FPGA高端项目:图像采集+Aurora 8B10B+UDP图传架构,基于GTH高速收发器的光口转网口,提供工程源码和技术支持
fpga开发·架构·udp·aurora·gth·高速收发器·aurora 8b10b
徐晓康的博客2 天前
Verilog功能模块--SPI主机和从机(03)--SPI从机设计思路与代码解析
fpga开发·verilog·主机·spi·从机
listhi5203 天前
FPGA设计中的信号完整性量化与优化:探索高速数字系统的关键路径
fpga开发
hahaha60163 天前
xilinx的oddr原语是否可以直接使用verilog实现?
fpga开发
I'm a winner3 天前
FPGA 在情绪识别领域的护理应用(三)
fpga开发·前沿研究
小眼睛FPGA4 天前
【盘古100Pro+开发板实验例程】FPGA学习 | gamma 变化 | 图像实验指导手册
科技·学习·ai·fpga开发·fpga