跳转到主要内容

如何实现FPGA的可重复性设计

judy 提交于

本文转载自:<span id="profileBt"><a href="https://blog.csdn.net/wuzhikaidetb/article/details/126243908?utm_source…;孤独的单刀的CSDN博客</a></span>

<font color="#FF8000">注:本文由作者授权转发,如需转载请联系作者本人</font>

<strong>概述</strong>
主要翻自xilinx《WP361,Maintaining Repeatable Results》。

满足设计中的时序要求本身可能很困难,所以生成 100% 可重复的时序设计似乎是不可能的。幸运的是,有一些设计流程概念可以帮助复现可重复的时序结果。

影响最大的四个方面是:

<li>HDL 设计</li>
<li>综合优化 </li>
<li>布局布线</li>
<li>实现选项</li>

<strong>HDL 设计</strong>
具有非常高的资源利用率和频率要求的设计要获得可重复的结果是一件最具挑战性的事情,但是它们也是最需要可重复结果的设计。获得可重复结果的第一步是良好的设计实现(RTL)。已经有几篇关于这个主题的论文,但本文有一些重点和一般建议。

<strong>HDL 修改</strong>
通常,HDL 修改是解决时序问题的最佳方法。如果两条不同的路径需要相同的资源(逻辑组件或布线)来满足时序要求,那么其中一条路径将失败。如果修改 HDL 以使时序更容易满足,那么这将不是问题。

<strong>良好的层次边界 </strong>
遵循良好的分层边界设计有助于逻辑整合,这有助于在进行设计更改时保持可重复的结果。需要遵循的几条规则包括:

<li>将需要优化、实现和验证的逻辑放在同一个层次结构中</li>
<li>寄存模块的输入和输出,这包括了模块内的时序路径 </li>
<li>将需要打包到更大 FPGA 资源(例如 Block RAM 或 DSP)中的所有逻辑保持在同一层次结构中</li>

<strong>逻辑级数</strong>
LUT 逻辑级别过多的设计很难获得可重复的结果。通常,问题不是 LUT 延迟,而是 LUT 之间的布线延迟。这在设计的高性能领域极为重要。 以下是太多逻辑级别的一些常见来源:

<li>大型的 if/else 结构</li>
<li>大型 case结构 — 适当使用“full_case”和“parallel_case”Verilog 指令来优化逻辑较少的 case 语句,这通常可以减少逻辑级数</li>
<li>多路复用器/解码器——大型多路复用器/解码器会造成路由拥塞,从而导致不可重复的结果。多级寄存多路复用器/解码器路径可以帮助解决此问题 </li>
<li>加法器——使用加法器链而不是加法器树。加法器链提高了性能,同时降低了设备利用率和功耗。 (但是,它们确实在设计中引入了延迟。) </li>

有关编码最佳实现的更多信息,请参阅 WP231, HDL Coding Practices to Accelerate Design Performance

<strong>复位和其他控制信号</strong>
复位的选择会影响设计的性能、面积和功耗。上电时电路初始化不需要全局复位,但全局复位会对设计中可使用的资源类型产生重大影响。例如:

<li>如果 HDL 中存在全局复位,则无法推断移位寄存器 (SRL)。一个移位寄存器与十个寄存器相比,会产生更多可重复的结果。</li>
<li>DSP 和 Block RAM 寄存器仅包含同步复位。如果代码中使用了异步复位,这些寄存器就不能使用,强制使用CLB寄存器。如果将寄存器打包到 DSP 和/或块 RAM 中,则相同的结果更易于维护。 </li>
<li>在通用逻辑上使用同步复位可能会降低逻辑级数。slice里的寄存器可以有异步或同步复位。如果设计使用同步复位,则同步设置可供组合逻辑使用。这可以减少一级逻辑级数 </li>
<li>控制集由一组独特的时钟、时钟使能、设置、复位组成,在分布式 RAM 的情况下,还包括写使能信号。控制集信息很重要,因为寄存器必须共享相同的控制集才能打包在同一SLICE中。这会影响SLICE利用率,产生可重复的结果问题。</li>

有关复位的更多信息,请参阅 WP272, Get Smart About Reset: Think Local, Not Global

有关控制集的更多信息,请参阅 WP309,Targeting and Retargeting Guide for Spartan-6 FPGA

<strong>了解 FPGA 资源 </strong>
了解可用的 FPGA 资源以及何时如何使用它们非常重要。通常,有综合指令来定义应该使用哪些资源。

<li>Block RAM — 最适合深存储器要求。</li>
<li>分布式 RAM — 适用于宽总线,尤其是在高速数据由区域时钟提供时钟的情况下。 </li>
<li>RAM 控制信号 — 块 RAM 和分布式 RAM 都可能存在控制信号扇出较大的问题。复制控制信号并使用布局规划技术将具有相同信号的模块保持在一起有助于保持可重复的结果。 </li>
<li>移位寄存器——SRL 可以降低设计的利用率,这有助于实现可重复性。有几个性能问题需要牢记:</li>

SRL 的时钟输出比 FF 的时钟输出慢;因此,使用 FF 作为移位寄存器的最后一级是有用的。大多数综合工具会自动执行此操作,但如果涉及移位寄存器的路径存在问题,最好确认最后一级是寄存器。

在 SRL 前面有一个 FF 为布局器提供了更多选择来满足时序要求,从而保持结果。同样,大多数综合工具会自动执行此操作,但如果涉及移位寄存器的路径存在问题,最好确认第一阶段是寄存器。

寄存器 — FPGA 有许多寄存器,使流水线成为提高性能的有用技术。在多个流水线触发器上禁用 SRL 推断非常重要。

有关 Block RAM 的更多信息,请参见 WP231, HDL Coding Practices to Accelerate Design Performance

有关移位寄存器的更多信息,请参见 WP271, Saving Costs with the SRL16E

<strong>时钟域问题</strong>
必须正确约束跨不相关时钟域的路径。来自同一源时钟(例如 DCM)的时钟由工具自动关联。 PERIOD 约束也可以关联外部时钟。

未在设备内部创建的不相关时钟需要特别考虑。默认情况下,这些时钟不受工具限制。如果有特殊的时序考虑,则需要使用 FROM:TO 约束来正确约束路径。 DATAPATHONLY 关键字告诉工具不要在方程式中包含时钟偏差。

有关详细信息,请参阅中的“异步时钟域”部分UG625, Constraints Guide,或WP257, What Are PERIOD Constraints?

确保不发生竞争条件也很重要。当从一个时钟域跨越到另一个时钟域时,可以使用 FIFO。如果条件不允许,则应仅对一个控制信号进行双同步,并且该控制信号应在接收时钟域中用于接收其他信号。

<strong>高扇出信号 </strong>
通常,高扇出信号可能是设计中的门控因素。尽管大多数综合工具都有扇出控制,但建议在 HDL 中复制这些信号以获得更多可重复的结果。这需要与指令相结合,以确保合成工具不会删除重复项。如果高扇出信号在顶层逻辑中,一种方法是复制该信号,然后用单独的信号驱动每个顶层模块。

如果综合工具扇出控制没有给出期望的结果,并且修改 HDL 不合适,那么在 MAP 中使用寄存器复制以及最大扇出约束通常会比综合做出更好的寄存器复制选择。有关详细信息,请参阅 MAX_FANOUT UG625, Constraints Guide。

<strong>信号名称</strong>
作为一般调试问题,如果信号名称在跨层次结构时保持不变,则更容易跟踪问题路径。如果名称不断更改,则很难在时序报告和其他调试输出中跟踪。 将信号方向放在所有模块或实体的端口定义上也很有帮助。

<strong>综合优化</strong>
综合对可重复的结果有很大的影响。如果综合输出的网表不是最优的,那么实现工具就不可能有理想的条件。 可以使用多种综合技术来帮助改进实现结果:

<li>运行综合时使用时序约束。在综合期间过度约束是很常见的,然后放宽Vivado工具中的时序约束。这使得综合工具更加工作,减轻了实现工具的负担。</li>
<li>使用综合工具的时序报告。如果一条路径在综合和实现中的时序失败,修改 HDL 或综合选项以满足综合后的时序。这可以节省实施运行期间的时间。 </li>
<li>在实施工具中获得可重复结果的最佳方法是综合过程中的可重复结果。大多数综合工具支持自下而上的流程,为顶层设计和每个较低层模块提供单独的综合项目。用户可以根据 HDL 变化控制更新哪个网表。 </li>
<li>大多数综合工具都有增量流程。 </li>

<strong>布局</strong>
布局规划将组件的放置锁定到特定位置或范围。这减少了放置的可变性,增加了设计的可重复性。更好的性能几乎总是可以通过布局规划和/或使用位置约束来获得。也就是说,糟糕的布局或糟糕的位置限制可能会导致无法满足时序要求。布局在某种程度上是一门艺术,需要对工具和设计有深入的了解。符合时序的实现结果可用作创建良好布局的指南。 有几个不同的布局层级:

<li>Pinout Selection</li>
<li>Area Group Floorplanning </li>
<li>Locating Core Blocks</li>
<li>Locating the Entire Module</li>
<li>Locating the Critical Path</li>

<strong>引脚选择</strong>
如果主要根据电路板要求选择引脚,FPGA 实现工具可能很难保持可重复的结果。以下建议有助于实现可重复性:

<li>注意数据流向。例如,数据可以从中心 I/O 传输到侧 I/O。</li>
<li>将所有与总线相关的管脚保持在 FPGA 的同一区域,以限制控制信号的布线距离。 </li>
<li>I/O 总线控制信号应放置在地址和数据总线附近。 </li>
<li>要一起优化的信号需要放在一起。 </li>
<li>如果电路板布线是更重要的因素,那么I/O 上的流水线寄存器可以通过更少的引脚来帮助 FPGA 布线。</li>

<strong>区域组布局 </strong>
区域组布局规划很容易做到,但它经常被误用,造成糟糕的布局规划,产生的问题反而多于解决的问题。 良好布局的一些一般准则包括:

<li>保持所有区域组的利用率相似。例如,不要一个利用率在 60%,另一个则在 99%。</li>
<li>不要使用重叠区域组。一个例外是,如果两个不同的区域组有一些逻辑元素需要放在一起,则可以接受一两行或两列 CLB 的重叠。然后,用户负责确保有足够的资源用于两个区域组约束。如果设计中有两个不同的逻辑部分需要位于同一物理位置,请将这两个逻辑部分放入同一区域组。 </li>
<li>一级嵌套通常是可以接受的。如果较大区域组的一小部分需要位于狭窄区域中,这可能是必要的。 </li>
<li>布局只是设计的关键部分。 </li>
<li>连接到固定资源(例如,I/O、收发器或处理器块)的逻辑可能会受益于布局。 </li>
<li>使用良好实现运行的结果作为确定布局或时序问题的指南。 PlanAhead™ 软件和时序分析器等工具可以帮助可视化解决问题。 </li>
<li>尽量减少用于每个全局时钟的区域数量以及每个区域中的时钟数量(区域和全局),这通常很有帮助。如果要向时钟区域添加更多逻辑,请不要过度约束并应该相应计划。当一个时钟区域中的所有时钟都被使用时,很难找到一个有效的布局。使用 PlanAhead 软件的捕捉时钟区域的能力可以使布局规划更容易。对于具有 10 多个全局时钟的 Virtex® FPGA 设计,当前实现中使用的时钟区域位于 .map 报告文件中。 UCF 约束也包含在此文件中。</li>

有关区域组布局规划的更多信息,请参阅UG632, PlanAhead User Guide 和UG633, Floorplanning Methodology Guide。

<strong>Locating Core Blocks</strong>
通常,定位核心组件,例如 BRAM、FIFO、DSP、DCM 和全局时钟资源有助于实现可重复性。最好通过查看良好的布局并使用设计知识来验证这些是处于良好的位置来完成。在定位这些BRAM、FIFO 和 DSP 组件时,应考虑控制信号和数据流向(总线对齐)。在 .map 报告文件中可以找到用于定位现有设计的时钟区域的约束。保持相同的时钟区域可防止布局器更改时钟区域划分,这可能会改变设计的布局规划。使用 reportgen -clock_regions design.ncd 创建报告。

<strong>定位整个模块 </strong>
PlanAhead 软件能够锁定关键模块上的所有布局信息。下次运行时,布局相同,但不保存布线信息。有关 PlanAhead 软件中位置约束的更多信息,请参见 UG632,PlanAhead User Guide.

<strong>定位关键路径 </strong>
如果锁定整个模块是多余的,则可以在 PlanAhead 软件中锁定关键路径。这种技术应该以非常有限的方式使用。如果存在导致大多数问题的特定路径,则最好通过更改 HDL 来解决时序问题。如果这是不可能的,有限使用定位特定时序路径可能会有所帮助。

<strong>实现选项</strong>
实现工具中的几个选项提高了可重复性。以下是一些有助于保持可重复结果的一般准则:

<li>使用分区的设计保留是保留实现的最佳方法,但它并不适合所有设计,而且它确实有 HDL 设计要求。</li>
<li>SmartGuide™ 技术是保持可重复结果的另一种选择。这最适用于没有推动绝对最大 QoR 或利用率的设计。 </li>
<li>如果设计保留或 SmartGuide 技术不适合设计,则使用 SmartXplorer 或 PlanAhead 软件策略来保持时序。 </li>
<li>对于具有高 QoR 要求的设计,有高级实现选项可帮助保持时序。</li>
<li>管理利用率是保持可重复结果的关键。 </li>
<li>在整个设计阶段保持相同的软件版本有助于实现可重复的结果</li>

<strong>设计保留</strong>
设计保留流程使用分区。这是保证可重复结果的唯一方法。设计保留的主要目标是实现一致的模块性能,以减少时序收敛阶段的时间量。它还要求用户对遵循良好的设计实践做出最大的承诺。

分区保留先前已实现的设计的未更改部分。如果分区的网表未更改,则实现工具使用“复制粘贴”过程来保证保留该分区的实现数据。通过保留实现结果,分区可以在不影响设计的保留部分的情况下实现设计的修改部分。 在 12.1 和未来版本中,PlanAhead 软件和命令行工具支持设计保留。

有关设计保留的更多信息,请参阅 WP362,Repeatable Results with Design Preservation,以及 UG748,Hierarchical Design Methodology Guide.

<strong>SmartGuide 技术</strong>
SmartGuide 技术在运行实现时使用之前的实现结果作为起点。 SmartGuide 技术的主要目标是减少运行时间。可以移动引导布局和/或布线,以便对设计进行布线或满足时序要求。 SmartGuide 技术最适用于不试图突破 QoR 或利用率限制的设计。

在以前版本的工具中,有一个精确指南和一个杠杆指南。通常,精确的指导方法会导致设计无法路由。如果需要精确保存,则建议的流程是设计保存。杠杆式指南已被 SmartGuide 技术取代。

经常有人问是否应该使用 SmartGuide 技术或分区。答案取决于设计师在设计流程中的位置。在进行小的设计更改时,应在设计周期结束时使用 SmartGuide 技术。使用此流程,很容易看出提议的更改是否适用于设计。分区需要更大的承诺来遵循良好的设计层次结构规则。应在何时决定使用分区的设计保存流程开始组织HDL。此规则的一个例外是当设计已经遵循分区的分层规则时。

有关详细信息,请参阅设计注意事项章节 UG626, Synthesis and Simulation Design Guide。

<strong>SmartXplorer</strong>
SmartXplorer 和 PlanAhead 软件是有助于实现时序收敛的工具。这两种工具都运行不同的实现选项集,以找到最适合设计的方案。然后可以使用这些结果来查看哪些布局往往具有更好的时序结果。然后可以使用这些布局结果来创建良好的区域组布局规划。不同的结果也可能指向设计问题。如果同一路径在所有运行中都失败,则更改 HDL 以消除时序问题是有益的。

SmartXplorer(Variability Passes)和 PlanAhead 软件的另一个很好的用途是使用不同的成本表运行多个实施。成本表会影响设计的初始布局。通常,不同的起点允许处于满足时序边缘的设计满足时序。运行前十个成本表通常就足够了。一旦找到一个好的成本表,它通常可以用于多次设计迭代。当它不再工作时,用户需要搜索一个新的。 SmartXplorer 还支持 XST 综合的不同选项。应该使用这种方法找到用户设计的最佳综合选项。

有关这两种工具的详细信息,请参阅 WP287, Timing Closure Exploration Tools with SmartXplorer and PlanAhead Tools.

<strong>高级实施选项 </strong>
在设计之初,建议对 MAP 和 PAR 使用默认的尝试。一开始使用过多的高级选项会隐藏时序问题,而修改 HDL 可以最好地解决这个问题。当设备利用率增加时,工具越来越难以收敛到符合时序的解决方案。如果使用默认选项,则可以使用更高工作量的选项来获得设计流程后期的最后几皮秒时序,从而保持时序结果。 有关实施选项的更多信息,请参见 UG628,Command Line Tools User Guide.

<strong>管理利用率</strong>
LUTS/FFS 利用率低 (<25%) 或 LUTS/FFS 利用率高 (>75%) 的设计可能难以一致地布局和布线。对于利用率高的设计,请查看slice控制集、复位(FPGA 通常不需要同步复位/设置)、逻辑使用率高于预期的模块(在 PlanAhead 中很容易完成),或者是否正在发生 SRL/DSP48 推理。

高利用率的另一面是低利用率。对于所有组件类型的利用率为 25% 或更少的设计,低利用率算法会生效并保持组件紧密放置。但是,如果 I/O 利用率超过 25%,则实施工具可以分散设计,以便将逻辑保持在 I/O 附近。仔细放置 I/O 和使用区域组可以最大限度地减少此问题。

<strong>软件版本</strong>
尽量在时序收敛阶段使用同一版本的综合软件。因为不同版本的软件可能对时序收敛的算法并不一致。

<strong>结论</strong>
有很多种方法来实现设计的可重复性。最好的方法是保持合理高效的HDL设计准则,且通过修改HDL的方式来对时序收敛。如果这种方法无法实现可重复性,则可以通过使用综合、实现、布局策略来实现。设计保留使用分区来保证数据流。SmartXplorer是一种使用之前实现结果的技术。如果一个设计的资源使用率非常高且有很高的质量要求,那么最好的方法可能是通过 PlanAhead 或者SmartXplorer软件以设定不同的布局和实现选项来实现单一的扁平化设计。