一个需要以太网的项目中,FPGA原型编译时遇到此问题
[DRC PDRC-248] HDIOLOGIC_IPFF_unsupported_D_fanout: The IPFF in HDIOLOGIC_M_X0Y37 (from cell xxxx/u_gmac/u_gmac/DWC_gamc_inst/DWC_gmac_rmii_inst/DWC_gmac_rmii_mrr_inst/crsdv_d,IOB=TRUE)has its D pin driven by net phy_rxdv_ibuf/O which is connected to other loads.This will create an unroutable situation.Please check your design and constranits..
搜索查询到解决办法为:
set_attr IOB FALSE [get_cells -of [get_pins -filter {direction=~in} -leaf -of [get_nets -of [get_pins -filter {direction=~out} -of [get_cells -of [get_pins -of [get_nets -of [get_ports phy_rxdv]]]]]]]]
具体参照链接[DRC PDRC-248] HDIOLOGIC_IPFF_unsupported_D_fanout error when connecting axi_quad_spi input signal to other logic
在 Vivado 中,避免 IOB 约束冲突的关键在于正确地设置和管理约束,确保信号的寄存器与 IOB 的使用方式一致。以下是一些避免 IOB 约束冲突的建议和方法:
1. 理解 IOB 约束的作用
IOB 约束用于指定信号是否使用 FPGA 的 I/O 寄存器(IOB)。设置 IOB TRUE 表示将寄存器放在 IOB 中,而 IOB FALSE 表示将寄存器放在 CLB 中。
2. 避免冲突的通用方法
(1)明确指定信号的寄存器位置
• 如果信号需要寄存器,确保在约束文件中明确指定其位置。例如:
tcl复制
set_property IOB TRUE [get_ports {port_name}]
或者:
tcl复制
set_property IOB FALSE [get_ports {port_name}]
这样可以避免默认行为导致的冲突。
(2)检查信号是否驱动多个寄存器
如果一个端口驱动多个寄存器,需要在每个寄存器上单独设置约束,而不是在端口上设置。
3. 自动查找相关寄存器并设置约束
可以通过以下 Tcl 命令自动查找与端口相关的寄存器并设置约束:
tcl复制
set_property IOB FALSE [get_cells -of [get_pins -filter {direction=~in} -leaf -of [get_nets -of [get_pins -filter {direction=~out} -of [get_cells -of [get_pins -of [get_nets -of [get_ports {port_name}]]]]]]]]]
这种方法可以避免手动追踪信号路径。
4. 处理冲突提示
如果出现类似以下的冲突提示:
CRITICAL WARNING: [Shape Builder 18-539] Setting IOB or IOB_TRI_REG property to FALSE for instance ... conflicts with its current constrained placement.
这表明设置的约束与当前布局冲突。解决方案包括:
• 检查是否有多余的布局约束(如 LOC 约束)与 IOB 约束冲突。
• 如果冲突不可避免,可以考虑移除或调整冲突的约束,但需确保不会影响设计功能。
5. 确保信号的寄存处理
为了避免信号路径中寄存器的布局问题,确保信号在进入 OBUF 或 IBUF 之前已经寄存。例如:
verilog复制
always @(posedge clk) begin
reg_signal <= input_signal;
end
这样可以确保信号在 IOB 中正确寄存。
6. 检查未约束的逻辑端口
如果出现未约束的逻辑端口错误(如 [DRC UCIO-1]),需要为所有逻辑端口指定位置约束(LOC)或 I/O 标准(IOSTANDARD)。例如:
tcl复制
set_property PACKAGE_PIN {pin_number} [get_ports {port_name}]
set_property IOSTANDARD {LVCMOS33} [get_ports {port_name}]
这可以避免因未约束导致的布局问题。
总结
避免 IOB 约束冲突的关键在于:
1. 明确指定信号的寄存器位置。
2. 避免在端口上直接设置约束,而是针对具体的寄存器。
3. 使用自动化工具查找并设置相关寄存器的约束。
4. 检查并调整可能导致冲突的布局约束。
通过以上方法,可以有效避免 Vivado 中的 IOB 约束冲突,确保设计的正确实现。
IOB 约束之[DRC PDRC-248] HDIOLOGIC_IPFF_unsupported_D_fanout:
于 2025-03-18 14:16:00 首次发布