问题描述:
我把7020的工程移植到XCZU19EG上用Vivado编译时报错:
[DRC REQP-1741] IDELAY3 drivers invalid load :IDELAY3 data_progress_U0/u_delay_rxd DATAOUT pin(net: data_progress_U0/data_clk)may not drive a BUFG*
原因:
除了时钟信号外,任何输入信号都可以使用 IDELAYE3 原语进行延迟,然后直接转发到设备逻辑,或者使用输入/输出互连(IOI)内的单数据速率(SDR)时钟或双数据速率(DDR)时钟在简单的触发器、IDDR 或 ISERDESE3 中进行寄存。不应使用 IDELAYE3 延迟时钟,因为 IDELAY 无法直接连接到全局时钟缓冲器。如果必须延迟时钟,使用 MMCM 或 PLL 进行时钟生成,并使用精细相位偏移功能延迟时钟。
IDDELAYE3 原语包含一个 512 级延迟线。请参阅 UltraScale 数据表中的抽头分辨率。每个单独的抽头都是未校准的。但是,用于校准延迟线的逻辑在 IDELAYCTRL 组件中可用。IDDELAYE3 可以在两种模式下使用,即计数模式和时间模式。
XCZU19EG是Zynq UltraScale+ MPSoC FPGA,相比于XC7Z020底层约束更加严格,所以在XC7Z020上编译时不会报错,XC7Z020允许使用IDELAY的输出驱动BUFG,但是XCZU19EG不能。
解决方法:
1、如果想用DATAOUT驱动BUFG、MMCM或PLL,必须插入一个基本的LUT1,如下所示:
(*dont_touch="yes")LUT1#(.INIT(2'b01))LUT1_Inst(.O(to_BUFG_orMMCM_orPLL),.I0(from_DATAOUT));根据下表确定INIT值(不同输入的LUT,INIT位宽也不同,例如LUT3的INIT值位宽为8bit):
| 作用 | INIT值 | 例化 |
|---|---|---|
| 信号直通(输出=输入) | INIT = 2’b01 | LUT1 #(.INIT(2’h1)) |
| 信号取反(输出=反相) | INIT = 2’b10 | LUT1 #(.INIT(2’h2)) |
| 生成逻辑0(输出=0) | INIT = 2’b00 | LUT1 #(.INIT(2’h0)) |
| 生成逻辑1(输出=1) | INIT = 2’b11 | LUT1 #(.INIT(2’h3)) |
以上方法亲测有效
2、使用 MMCM 或 PLL 进行时钟生成,并使用精细相位偏移功能延迟时钟。
参考:https://adaptivesupport.amd.com/s/question/0D52E00006hpRavSAE/idelaye3-output-cannot-drive-a-bufg-in-ultrascale?language=en_US