当我在Xilinx Virtex – 7 FPGA平台上进行高速SerDes设计时,曾遭遇动态功耗直接飙升至12W这种的情况。针。
第一步 关掉未使用的时钟域
先是操作路径,从Vivado开始,进入Tools,再进入Power,接着选择Report Power,然后就是要勾选“Report unused clock domains”。之后呢,在生成的报告当中,去找到所有未连接的BUFGCE以及MMCM输出,随后右键点击“Set Clock Gating”,最后把它的门控使能信号强制拉低。在XDC约束文件里,针对DSP48以及BRAM模块,添加这句话: set-clock-gating -module -type cell -cells {inst_dsp} -clock_gating_enable false。参数数值是固定的,这个值是0.5ns的建立时间余量,不能随便去更改。
以下是新手需避开的坑相关内容,一个比较普通的报错情况是,出现“Clock gating insertion failed – timing violation”这样的提示。其最为关键的原因在于,当把门控逻辑插入之后,导致路径延迟发生了增加这种情况。而关于此种情况的快速解决办法是,先在XDC当中,对该路径放宽相关的时序约束,再设置set_max_delay -datapath_only,使其变为2.0ns,之后重新进行综合动作。
第二步 调整输出驱动强度
下面是操作路径的具体步骤,先要进入Vivado的IO Planning界面,接着选中所有高速输出引脚,然后在IO Standard下拉菜单中,选择“LVCMOS12”,用以替代默认的“LVCMOS18”。之后在Slew Rate选项中要统一选择“SLOW”模式,并且在Output Drive Strength输入框里填入固定值“4mA”。就是针对DDR3接口而言,还得在Device Constraints里勾选“DDR Output Impedance Calibration”,然后把ODT阻值设定成40Ω。
【新手避坑】:常见出现错误提示:在进行信号眼图测试期间,出现数量很多的误码。核心的原因是:驱动电流下降到很低的程度导致上升沿变得缓慢。能够快速解决问题的方式是:先把Drive Strength提升到8mA,使用示波器测量一下眼宽,要是大于0.7UI就依次逐步地向下调整为6mA,不要一下子直接降低到4mA。
有两种方案在此对比,方案一所采用的方式为整体统一运用LVCMOS18加上8mA来驱动,它具备信号质量稳定这一优点,然而其缺点是功耗会高出35%,方案二则是依照上述步骤对每一个引脚进行逐引脚微调,对于距离较近的时钟线运用LVCMOS12加上4mA来进行驱动,对于距离更远的数据线则保留运用LVCMOS18加上6mA来进行驱动,存在这样一种取舍逻辑,即PCB走线长度超过3英寸的引脚必定要使用方案A的参数,而3英寸以内的引脚就要使用方案B。
第三步 精确控制动态电压缩放
操作路径如下,在Vivado的Power Management窗口内选择“Dynamic Voltage Scaling”选项卡,勾选“Enable per-region DVFS”,在Voltage Scaling表当中,针对PL逻辑区域输入目标电压值“0.85V”(其默认值为1.0V),而且将频率补偿系数填入“0.95”。同时在约束文件里添加: set_power_opt -voltage_scaling -target_voltage 0.85 -freq_comp 0.95。关键参数的最优推荐数值为0.85V,原因在于其恰好处于绝大多数28nm工艺的阈值电压拐点上,能够确保在时序收敛的情况下功耗下降最为显著。
新手需避开的坑:有多高频率就有多完整的报错,其内容为“ERROR:此报错编号存在于Power 28 – 87这个范围中,电压缩放这项操作失败了,核心电压低于了最低所需的数值,进而导致设备关机”。 )。具备全面一次解决的流程是这样的:先针对板级电源芯片,要去查验供电纹波是不是高出50mV,要是超出标准范围,就在VCCINT输入端添加10μF钽电容加上100nF瓷片电容来进行滤波。再再度上电之后进入硬件管理器,把PMBus寄存器值读取回来,去确认实际电压是不是稳定在0.87V上。然后,把目标电压从0.85V更改成0.88V,再生成比特流并实施下载。这个流程通过实际测试解决成功率是超过90%的。
DVFS需要额外增添一颗可编程电源芯片(例如LTC3880)所以这个方法不适用于超低功耗电池供电类场景,该芯片本身会额外消耗掉3至5mW的静态电流。要是项目是纽扣电池供电的小型传感器,建议直接采用固定0.9V供电,再搭配时钟门控来进行功耗优化,如此简单粗暴还可省掉电源芯片的成本。











