如何在赛灵思FPGA设计中保留可重复结果?
2011-07-26
满足设计的时序要求本身已非易事,而要实现某项设计的整体时序具有完全可重复性有时候却是不可能的任务。幸运的是,设计人员可以借助有助于实现可重复时序结果的设计流程概念。影响最大的四个方面分别是 HDL 设计实践、综合优化、平面布局和实施方案。
就获得可重复结果而言,资源利用和频率要求都很高的设计是最大的挑战。它们也是可重复结果流程需求最高的设计。得到可重复结果的第一步是在 HDL设计阶段运用设计合理的实践。遵循出色的分层边界实践有助于保持逻辑整体性,而这在设计变更时有助于保持可重复结果。一条不错的规则就是把那些需要整体优化、实施和验证的逻辑放在同一层级。另外需要记录模块的输入和输出。这样就可以把时序路径保持在模块内部,从而避免模块改变时引起相互影响。最后,把所有需要放入更大 FPGA资源 (如 Block RAM 或 DSP)的逻辑全部设置在相同层级。
逻辑电平
从所需 QoR 结果需要太多查询表(LUT) 逻辑电平的设计很难获得可重复结果。LUT 延迟一般不是问题所在,而问题是 LUT 之间的路由延迟。这在设计的高性能领域至关重要。
逻辑电平过多往往归因于 i f /else结构较大和选择语句较长。如果合适,可以采用 “ful l_case”和 “paral lel_case” Veri log 指令优化较少逻辑的选择语句,这种技巧一般能够减少逻辑电平。较大的多路复用器或者解码器可能造成路由拥塞,从而导致不可重复的结果。多级注册多路复用器 / 解码器路径有助于解决此问题。对于加算器而言,用注册的加算器链代替注册加算器树可以提高性能。如果加算器全部注册的话,则链会比树造成更长时延。有关编码最佳实践的更多信息, 请参考赛灵思白皮书 《提高设计性能的 HDL 编码实践》 (WP231), http://www.xilinx.com/support/documentation/white_papers/wp231.pdf。
复位与其他控制信号
复位的选择会影响到设计的性能、面积和功率。加电时电路初始化并不需要全局复位,但是它会对设计过程中能够采用的资源类型产生重大影响。如果在 HDL 中存在全局复位,则无法推断移位寄存器。一个移位寄存器产生的可重复结果比十个寄存器还多。
另外,DSP 和块 RAM 寄存器仅仅包含同步复位。如果编码中包含异步复位,则无法使用此类寄存器,从而迫使设计中转而使用可配置逻辑块 (CLB)寄存器。而把寄存器放入 DSP、块 RAM 或者同时放入二者中更容易保持相同结果。在一般逻辑中运用同步重置可减少逻辑电平。slice 寄存器能拥有异步或同步复位。如果设计采用同步复位,那么组合逻辑就可以采用同步置位。这样就可以降低一个 LUT 的逻辑电平。
一个控制置位包含一组独特的时钟、时钟启用、置位与复位信号,而且在分布式 RAM 中还包含可写入信号。控制置位信息非常重要,因为寄存器必须共享封装在同一片中的同一控制置位信号。这可能影响封装和利用率, 造成可重复结果问题。有关复位的更多信息,请参阅赛灵思 WP272 《复位诀窍: 考虑局部而非全局》 (http://www.xilinx.com/support/documentation/white_papers/wp272.pdf) 。有关控制置位的更多信息,请参阅WP309 《Spartan®-6 FPGA 定向与重定向指南》 (http://www.xilinx.com/support/documentation/white_papers/wp309.pdf ) 。尽管此白皮书专用于 Spartan-6器件,但其中还包含了适用于所有 FPGA的有益通用信息。
了解FPGA资源
了解什么样的 FPGA 资源可用以及何时是最佳利用时机至关重要。一般会有综合指令来定义使用哪些资源。例如,块 RAM 最适合深存储器 (deepmemory)需求,而分布式 RAM 适用于宽总线,尤其是在局部时钟为高速数据计时的情况下。块 RAM 和分步式 RAM在控制信号具有较大扇区出时会出现某种问题。重复控制信号并且采用布局规划技巧把块与相同信号融合在一起有助于维持可重复结果。
移位寄存器会降低设计的利用率,而其能够促进可重复性。有一些性能问题值得注意。SRL 的时钟到输出比触发器的时钟到输出慢; 因此,最好把触发器用作移位寄存器的最后一级。大部分综合工具都能自动实现这一点,但是,如果涉及移位寄存器的路径出现问题,则最好确认其最后一级是否为寄存器。
初始寄存器也存在类似问题。SRL前端设置触发器能让放置器有更多选以择满足时序要求,进而维持结果。同样,大部分综合工具都能自动实现这一点,但是,如果涉及移位寄存器的路径出现问题,则最好确认其最后一级是否为寄存器。
FPGA 有许多寄存器,从而使得流水线技术可在提高性能方面发挥重要作用。其中,重要的一点是禁用经多重流水线优化的触发器 SRL 推论。上文引用的关于 HDL 编码实践的白皮书 (WP231)提供了关于块 RAM 的更多信息。有关移位寄存器的更多信息,请参阅 WP271 《借助 SRL16E 节约成本》 (http://www.xi l inx.com/support/docume n t a t i o n /wh i t e _ p a p e r s /wp271.pdf ) 。
时钟域问题
设计人员必须慎重正确约束跨越不相关时钟域的路径。相关工具会自动关联来自相同源时钟 (如 DCM)的时钟。PERIOD 约束条件也能关联外部时钟。不是器件内部创建的无关时钟需要特殊考虑。系统默认不约束此类时钟。如果有特殊时序考虑,设计人员必须采用FROM:TO 约束条件正确约束相关路径。DATAPATHONLY 关键词会指示相关工具在等式中不包含时钟偏移。
更多信息,请参阅 UG625 《赛灵思约束条件指南》 ( http://www.xilinx.com/support/documentation/ sw_manuals/xi l inx11/cgd.pdf )或者 WP257 《何为PERIOD 约束条件?》 (http://www.xilinx.com/support/documentation/ white_papers/wp257.pdf)之中的 “异步时钟域”章节。
另外关键一点是确保不发生竞态状态。从一个领域跨越另一个领域时可以采用 FIFO。否则,设计人员需要双重同步一个 (仅有一个)控制信号,并且在接收时钟域利用其接收其它信号。
高扇出信号
高扇出信号通常会成为设计中的决定因素。即使大部分综合工具支持扇出控制,在 HDL 中复用这些信号来得到可重复性更高的结果也是明智之举。设计人员应该把这种策略和指令结合起来,以确保综合工具不会移除这些重复信号。如果一个高扇出信号位于逻辑顶层,则可以复用该信号,然后用单独信号驱动每一个顶层模块。
如果综合工具扇出控制不能得到预期结果并且无法修改 HDL,那么在BRAM 的 MAP 逻辑中采用寄存器复用约束条件以及最高扇出约束条件,往往会产生比综合更好的寄存器复用选择。更多相关信息,请参阅 《约束条件指南》(UG625) 中的 MAX_FANOUT。做为一个常见的调试问题,跨越层级时保持一致的信号名称更便于追踪存在问题的路径。如果信号名称经常改变,则很难追踪时序报告和其它调试输出。把信号方向放入所有模块或实体的端口定义中也有所裨益。
综合优化
综合会对可重复结果产生巨大影响。如果从综合过程得不到最佳输出网表,就无法在实施工具中产生理想条件。设计人员可以采用多种综合技术帮助改善实施结果。
在执行综合时采用时序约束条件至关重要。用户往往会在综合过程中过度约束,然后在赛灵思实施工具中放宽时序约束条件。这样可以增加综合工具负担, 从而减轻实施工具的负担。
接下来使用综合工具产生的时序报告。如果一条路径在综合与实施过程中无法满足时序要求,则可以修改 HDL或综合选项,以便在综合之后满足时序要求。这样可以在实施阶段节约时间。
在综合过程中得到可重复结果是在实施工具中得到可重复结果的最佳途径。大多数综合工具支持自下而上的流程,其为设计的顶层以及各个下层模块建立了独立综合项目。用户可以根据HDL 变更情况控制更新网表。大多数商用综合工具都具有增量流程。
平面布局规划的重要性
平面布局规划把组件定位到设计中的一个具体位置或者范围。这可以减少布局变化,从而提高设计的可重复性。通过平面布局规划或者采用位置约束 (或兼而用之)通常可以实现更高的性能。
也就是说,糟糕的平面布局规划或位置约束会导致无法达到时序要求。平面布局规划有一定技术含量,要求具备工具和设计方面的高级知识。你可以采用符合时序要求的实施结果做为指导原则来创建理想的布局。
如果主板需求是选择引脚布局的
主要因素,FPGA 实施工具可能很难获得时序维持可重复结果。但是设计人员可以借助多种有助于实现可重复性的技巧。
首先要清楚数据流。比如,数据会从中心 I/O 流向侧 I/O。可以把与总线相关的所有引脚保持在 FPGA 的同一领域,以此限制控制信号的布线距离。I/O总线控制信号布置在相关地址与数据总线附近。需要一起优化的信号应当布置在一起。如果更关注主板布线,则在 I/O上利用流水线技术优化寄存器有助于改进引脚布局差强人意的 FPGA 布线。
区域组平面布局规划
区域组平面布局规划是一种高级平面布局规划技术,其定义了模块在FPGA 之内的位置。虽然该技术易于使用, 但常常被误用, 从而导致所解决的问题比所造成问题更多这一糟糕平面布局结果。有一些出色平面布局规划的总体指导原则可以帮助您避免走入上述误区。应当使所有区域组保持相似的利用率。比如,应避免让一个分组利用率达到 60% 而让另一个达到 99%。不要重叠区域组。唯一的例外情况是,如果两个不同的区域组具有需要布置在一起的某些逻辑单元 , 则允许重叠 CLB 的一、两行或列。此时用户负责确保为两个区域组约束提供足够资源。
如果需要把设计的两个不同逻辑部分放在相同物理位置,则应当把它们放入同一个区域组。一般允许一层嵌套,也就是父区域组中的一个子区域组。如果一个大区域组里的一小部分需要布置到某个狭窄区域, 则需要上述分层。仅对设计中的关键部分进行平面布局规划而让相关工具决定非关键逻辑的布局非常重要。连接到固定资源 (如 I/O、收发器或处理器块)的逻辑可能会从平面布局规划中受益。可以采用顺利实施的结果做为准则来确定布局或时序问题。诸如赛灵思 PlanAhead ™软件 (图 1)和时序分析器等工具有助于可视化显示相关问题。
尽可能减少各个全局时钟所用区域数量以及各个区域的时钟 (区域与全局)数量一般会有所裨益。如果您准备为某个时钟域的增加更多逻辑,切勿过度约束,而应当进行相应规划。如果某个时钟域的时钟全部投入使用,则很难找到有效布局。而 PlanAhead 软件所提供的对齐时钟域功能可以简化上述平面布局规划工作。对于拥有 10 多个时钟域的Virtex® FPGA 设计而言,当前实施方案所用的时钟域位于 .map 报告文件中, 同时还附带了 UCF 约束条件。
有关区域组平面布局规划的更多信息,请参阅 UG632 《PlanAhead用户指南》 (h t t p : / / w w w . x i l i n x .com/suppor t /documentat ion/sw_ma n u a l s / x i l i n x 1 1 /Pl a nAh e a d _UserGuide.pdf)以及 UG633 《平面布局方法指南》 (http://www.xi l inx.com/support/documentation/sw_manuals/xilinx12_1/Floorplanning_Methodology_Guide.pdf) 。
块、模块与路径定位Block RAM、FIFO、DSP、DCM 以及全局时钟资源等核心器件的定位往往有助于实现可重复性。其最佳做法是着眼于良好布局,同时采用相关设计知识布局规划。可以采用 reportgen – clock_regions design.ncd 创建相关报告。PlanAhead 软件能够锁定关键模块的全部布局信息。在下一轮中,实施布局保持不变,但是并不保存布线信息。有关 PlanAhead 软件定位约束条件的更多信息,请参阅 UG632 《PlanAhead 用户指南》 、UG633 《平面布局规划方法指南》以及相关 PlanAhead 手册的 “设计的平面布局规划”章节。
如果锁定整个模块影响过大,则可以在 PlanAhead 软件中锁定某条关键路径。但是使用该方法时应当慎之又慎。如果某条具体路径导致某种主要问题,最好通过修改 HDL 来解决时序问题。否求。赛灵思 SmartGuide ™ 技术是另一种维持可重复结果的选择,最适合不强求最高 QoR 或最高利用率的设计。如果设计保存和 SmartGuide 技术都不适用于一种设计,则可以采用 SmartXplorer或 PlanAhead 软件策略维护时序。
对于 QoR 需求较高的设计, 有一些高级实现选项可以帮助维持时序。控制利用率往往是维持可重复结果的关键。随着设计规模增大,维持可重复结果的难度也随之提高。整个设计阶段始终采用相同软件版本有助于实现可重复结果。
设计保存
PlanAhead 中的设计保存流程采用分区,这是能够保证可重复结果的唯一验证相关位置是否适当。在定位这些BRAM、FIFO 与 DSP 器件时需要考虑到控制信号和数据流 (总线校准) 。可以在相关 .map 报告文件中找到用于定位现有设计的时钟域的约束条件。保持相同的时钟域可以防止布局器 (Placer) 修改时钟域分区,因为后者会改变设计的则, 应限制使用具体时序路径定位。
实现选项
实现工具中的多种选项都可以改进可重复性。基于分区的设计保存是保存实现方案的最佳方法,但是它并不适合于所有的设计而且确实存在 HDL 设计要方法。设计保存的主要目的是保持模块性能的一致性,以减少时序收敛阶段花费的时间。另外,它还要求用户尽可能遵从良好设计实践。
分区可以保存之前实现的设计的不变部分。如果分区网表保持不变,则实现工具可以采用复制 - 粘贴过程保证保存该分区的实现数据。通过保存实现结果,分区可以让你在不影响已保存部分的情况下实现修改后的设计部分。在图2 中,红色模块已经修改并且得到实现,而剩下的模块已锁定到位。
在 12.1 版和未来版本中, PlanAhead软件和命令行工具将支持设计保存功能。如欲了解更多信息, 请参阅 WP362 《基于设计保存的可重复结果》 (http://www.xilinx.com/support/documentation/white_papers/wp362.pdf ) 与 UG748 《分层设计方法指南》 (http://www.xilinx.com/support/documentation/sw_manuals/xilinx12_1/Hierarchical_Design_Methodology_Guide.pdf)。
SmartGuide 技术
SmartGuide 技术在执行实现方案时采用之前的实现结果作为起点,其主要目的是减少运行时间。可以迁移引导布局与布线或者同时迁移二者,以便完成设计的布线或满足时序要求。SmartGuide 技术最适合不强求 QoR 或利用率的设计。
以前版本的工具配套提供精准引导(exact guide) 和杠杆 (leveraged) 引导。通常情况下,精准引导方法过去会造成不可路由的设计。如果需要准确保存,则建议流程是设计保存。SmartGuide 技术可替代杠杆引导。
设计人员经常询问是使用Smar tGuide 技术还是分区技术,答案取决于在设计流程中所处位置。
SmartGuide 技术最适合进行小型设计更改时的设计末期。采用此流程,可以很轻松确定所建议更改任务是否适合相关设计。分区技术需要更专注于提前遵循良好设计层次规则。在开始组织 HDL 时应当决定是否采用基于分区的设计保存流程。设计已经遵循分区分层规则时则是例外情况。
如欲了解更多信息,请参阅 UG748《分层设计方法指南》 (ht tp: / /www.xi l inx.com/support /documentat ion/sw_manuals/xilinx12_1/Hierarchical_Design_Methodology_Guide.pdf )。
SmartXplorer
SmartXplorer 和 PlanAhead 软件策略都是有助于实现时序收敛的相似工具,采用不同实现选项集确定最适合相关设计的结果。您可根据这些结果确定哪些布局可能产生更好的时序结果并且创建理想区域组布局规划。不同的结果也可以指示某种设计问题。如果同一路径在各次运行时均失败,则可以通过修改 HDL 消除时序问题。
在设计的最初阶段,最好采用 MAP与 PAR 的默认努力程度 (default effortlevel)。在最初阶段采用太多高级选项可能会隐藏通过修改 HDL 即可轻松解决的时序问题。随着器件利用率提高,工具会越来越难以达到满足时序要求的解决方案。如果采用默认选项,则可以采用效用更高的选项获取设计流程后期时序的最后几皮秒, 从而维持时序结果。LUTS/FFS 利用率较低 (<25%) 或者其利用率较高 (>75%) 的设计很难实现一致的布局与布线。对于利用率较高的设计, 应当注意其 slice 控制置位信号、复位信号 (FPGA 一般不需要同步复位/置位)以及逻辑占用 (可以在 PlanAhead中轻松执行)或 SRL/DSP48 推理超出预期的模块。
高利用率的对立面是低利用率。对于所有组件类型的利用率均不超过 25%的设计,低利用率算法可以起作用并且能够实现组件的紧密布局。但是, 如果 I/O 利用率超过 25%,则实现工具可以把设计分散开,以便把逻辑保持在 I/O 附近。I/O 的谨慎布局以及采用区域组能够尽可能缓解上述问题。
软件版本
在时序收敛阶段应当尽量采用同一主要软件版本。因为不同的版本算法也发生改变,适用于一个版本的算法方法在其它情况下未必有效。另外,根据以前结果 (分区与 SmartGuide 技术)获得的方法可能不适用于主要版本。
促进设计可重复性的最佳方法是在HDL 中遵循良好设计方法并且通过修改HDL 解决所有时序问题。如果不可行,则可以借助于综合、布局规划和实现技术。基于分区的设计保存是可以保证实例性能的流程。SmartGuide 技术是另一种可采用以前实现结果的解决方案。