XILINX SSTL属性电平报错
错误如下:
DRC BIVRU-1\] Bank IO standard Vref utilization: Bank 33 contains ports that use a reference voltage. In order to use such standards in a bank that is not configured to use INTERNAL_VREF, the bank's VREF pin must be used to supply the appropriate voltage. Example port: pe_spi_sdi\[0\] (SSTL18_I). However, the following VREF sites are occupied and can't be used to supply the necessary voltage: site IOB_X1Y87 (occupied by port pe_spi_sdi\[1\]), site IOB_X1Y61 (occupied by port spi_rx_data). Free up VREF sites or create an appropriate INTERNAL_VREF constraint. #### **错误核心问题** * **Bank 33** 中的某些引脚(如 `pe_spi_sdi[0]`)使用了需要参考电压的 **SSTL18_I** 标准(一种差分信号标准)。 * 但该 Bank **未启用内部参考电压(INTERNAL_VREF)** ,因此必须通过 FPGA 的 **专用 VREF 引脚** 从外部提供参考电压。 * 而当前设计中,Bank 33 的 **两个可用 VREF 引脚** 已经被其他信号占用: * `IOB_X1Y87` 被 `pe_spi_sdi[1]` 占用 * `IOB_X1Y61` 被 `spi_rx_data` 占用 * 结果:**没有空闲的 VREF 引脚** 为 `pe_spi_sdi[0]` 提供参考电压,导致 DRC 报错。 * #### **根本原因** * **SSTL18_I 等高速信号标准需要参考电压**(如 SSTL18_I 需要 0.9V 的 VREF)。 * FPGA Bank 的 VREF 配置有两种方式: * **内部 VREF**(INTERNAL_VREF):通过 FPGA 内部电路生成(需在约束中启用)。 * **外部 VREF**:通过专用引脚从外部电源输入(需硬件连接)。 * 你的设计选择了 **外部 VREF**,但所有可用的 VREF 引脚已被其他信号占用,导致冲突。 * #### **解决方法** ##### **方案 1:启用内部 VREF(推荐)** 直接在约束文件中(如 XDC)添加以下命令,让 Bank 33 使用内部生成的参考电压: tcl 复制 ``` set_property INTERNAL_VREF 0.9 [get_iobanks 33] ``` **优点** :无需修改硬件或引脚分配,简单快捷。 **注意**:需确认 FPGA 型号支持内部 VREF,且电压值(0.9V)符合 SSTL18_I 标准要求。 *** ** * ** *** ##### **方案 2:释放被占用的 VREF 引脚** 将占用 VREF 引脚的信号(如 `pe_spi_sdi[1]` 和 `spi_rx_data`)**移到非 VREF 引脚**: tcl 复制 ``` set_property PACKAGE_PIN "新引脚位置" [get_ports pe_spi_sdi[1]] set_property PACKAGE_PIN "新引脚位置" [get_ports spi_rx_data] ``` **优点** :保留外部 VREF 的灵活性。 **缺点**:需重新布局引脚,可能影响其他信号完整性。 *** ** * ** *** ##### **方案 3:更换 IO 标准** 如果设计允许,将 `pe_spi_sdi[0]` 的 IO 标准改为 **不需要 VREF** 的类型(如 LVCMOS18): ``` set_property IOSTANDARD LVCMOS18 [get_ports pe_spi_sdi*] ``` **注意**:需确保新标准与硬件电路兼容(如电平匹配)。 *** ** * ** *** #### **如何选择?** * 如果 **硬件已设计为外部 VREF** → 选 **方案 2**(修改引脚分配)。 * 如果 **硬件未严格限定 VREF 来源** → 选 **方案 1**(内部 VREF,最简单)。 * 如果信号可改为普通电平标准 → 选 **方案 3**。 ## 约束$tco_max和$trce_dly_max说明 对于系统时钟而言,时钟来自源端,数据来自目的端,这样数据和时钟会有延时。 约束时需要告诉FPGA数据返回最大延时和最小延时时间; 原时序如下图所示:  输入信号 `$input_ports` 相对于时钟 `$input_clock` 的 **最大延迟** 不能超过 `$tco_max + $trce_dly_max`,否则可能无法正确采样。" * #### **输入延迟约束示例** ##### **(1) 最大输入延迟(Setup 检查)** ``` set_input_delay -clock clk_100m -max [expr $Tco_max + $Trce_dly_max] [get_ports data_in]; # 计算:3ns + 2ns = 5ns ``` **含义** : 数据从外部芯片发出后,最晚 `5ns` 到达 FPGA 引脚。 由于采样点在 `5ns`(半周期),工具会确保: `5ns(输入延迟) + Tsu(FPGA建立时间) < 5ns(采样点)` → 实际要求 `Tsu < 0`(显然不合理,需调整约束!) ##### **(2) 修正约束(考虑采样点在周期中心)** 正确的约束应使 **最大输入延迟 \< 半周期** (即 `<5ns`),否则数据可能错过建立时间。 若实际 `Tco_max + Trce_dly_max = 5ns`,则需 **提前时钟采样边沿** 或 **降低输入延迟**: 本人理解:时钟在上升沿采样,理论上100MHz的时钟中间采样,数据有效时间是5ns,如果delay时间大于等于5ns,那么没有建立时间,所以无法采集。特殊情况下我们可以特殊处理延时一个时钟周期或者半个时钟周期之后确定有效数据到FPGA时钟沿5ns以内。再做约束。 * ##### **最小输入延迟(Hold 检查)** set_input_delay -clock clk_100m -min \[expr $Tco_min + $Trce_dly_min\] \[get_ports data_in\]; # 计算:1ns + 1ns = 2ns **含义** : 数据最早 `2ns` 到达 FPGA 引脚。工具会确保2ns(输入延迟) \> Th(FPGA保持时间) * **关键点总结** * **采样点对齐** : 100MHz 中心采样 → 数据应在 `5ns` 处稳定。 * **最大延迟** : `Tco_max + Trce_dly_max` 必须 **\< 半周期 - Tsu**。 * **最小延迟** : `Tco_min + Trce_dly_min` 必须 **\> Th**。 * ## **内部终端电阻(Internal Termination)** * Xilinx FPGA(如UltraScale+/7系列)的部分IO标准支持**内部可编程终端电阻**(如DCI,Digitally Controlled Impedance)。 * 这里A7和K7系列不支持内部中断电阻匹配命令; * 若需在PCB上添加外部串行电阻(如信号线串联电阻),**Xilinx工具无法直接"指令化"添加物理电阻**,但可通过约束优化信号完整性: * #### **替代方案** * **(1)使用DCI阻抗匹配** 在单端信号(如DDR3的SSTL)中,通过IO标准激活DCI,自动匹配驱动阻抗和终端阻抗: ``` set_property IOSTANDARD SSTL15 [get_ports {your_port}] ``` * DCI会在IO bank启用时自动调整阻抗(需参考Bank电压和标准)。 * **(2)调整驱动强度(DRIVE)** 间接影响信号完整性(类似串联电阻效果): ``` set_property DRIVE 8 [get_ports {your_port}] ; # 可选值:4, 8, 12, 16 (mA) ``` * 这里的关系是:降低驱动强度(如设置`DRIVE 8mA`)可等效增大驱动阻抗(R_drv↑),从而减少与传输线的阻抗失配。但FPGA的驱动阻抗通常非线性,无法精确替代物理电阻。 * **(3)减缓压摆率**(减少高频噪声): ``` set_property SLEW SLOW [get_ports {your_port}] ``` * **注意**:此方法无法替代物理电阻的阻抗匹配功能,仅适用于短走线或低速信号。 * **(4)外部电阻** 若需要精确的串行电阻(如源端匹配),必须在PCB设计时手动添加。