01signal.com

Xilinx Partial Reconfiguration: Reset 和 decoupling

这是关于 Partial Reconfiguration或 Dynamic Function eXchange (DFX) 与 Xilinx的 Vivado的系列四篇文章中的第三篇。前两个展示了如何设置 FPGA design,而这个讨论了 static logic 如何应对 reconfigurable logic 消失和重新出现。

概述

加载 partial bitstream 的过程与物理硬件的 hot swapping 类似: 某个部件被突然移除,被另一个部件替换,然后通电。这篇文章讨论了确保这种过渡顺利可靠地进行的必要手段。

这篇文章假设 Partial Reconfiguration 是由 static logic 在 FPGA 本身上执行的。为确保顺利运行,应按以下阶段进行(说明如下):

对 decoupling的需求

在加载 partial bitstream的过程中, static logic 和 reconfigurable logic 之间的连接处于不可预知的状态。因此, reconfigurable module的 output ports 可能会生成 random patterns 或非法值。这并不一定会一直发生在每个 output port 上,但很可能会看到某种奇怪的行为。

由于无论加载 partial bitstream, static logic 都会继续运行,因此有必要忽略可能来自 reconfigurable module的不可预测的信号,以避免任何不利影响。 Xilinx的用户指南 UG909将其称为 decoupling

如何实现 decoupling 取决于 reconfigurable module的 output ports的性质: 应分析这些 ports 中的每一个对 static logic 的影响,并根据需要采取预防措施。例如,这可能涉及 output ports 的 multiplexing 在 reconfiguration期间具有中性值,将 clock-enable 添加到不应响应的 logic ,或在 reset中保留 static logic 的某些部分。

如果 reconfigurable logic 直接连接到 I/O pads,可能需要将它们置于 high-Z 模式或停用 I/O logic的 clock enable (如果 I/O logic 包括 output register)。此外,如果 reconfigurable logic 连接到外部组件,则可能需要在 reconfiguration之前使这些组件进入安全状态。

Partial Reconfiguration Decoupler IP 在 Vivado的 IP Catalog 中可用于 decoupling 的 AXI 连接。

reconfigurable module的 input ports 不需要这样的处理—— static logic 并不关心它驱动的信号是否被消耗。

关于 Ultrascale 设备,在加载“clearing bitstreams”之前需要 decoupling ,因为它们关闭了 reconfigurable logic。

关于 STARTUP sequence的几句话

bitstream (full 和 partial)的一个重要部分是 START configuration command,它启动了 STARTUP sequence。这个序列涉及到 logic的一致 bring-up 的目的的几个机制。

第一部分是在 configuration的末尾为 synchronous elements 分配了它们的默认值。 Ultrascale FPGAs 及更高版本始终如此。在 Series-7 FPGA上,对于 full configuration (即带有 initial bitstream)和 Partial Reconfiguration (如果启用 RESET_AFTER_RECONFIG )是正确的。

然后第二部分是 GWE (Global Write Enable,不要与 synchronous elements的 enable inputs 或 write-enable inputs混淆): 该信号允许 flip-flops 和 RAMs 改变值。 GWE 在 full configuration期间在整个 FPGA 上保持低位,并在 configuration startup sequence期间的某个阶段变为高位。加载 partial bitstream时,只有 reconfigured logic 受到影响。

自然地, GWE 的更改相对于 application logic提供的任何 clock 都是异步的,因此对于任何 synchronous element,此更改与第一个有效 clock 之间的 timing 是不可预测的。

在 Partial Reconfiguration 场景中,就像 full configuration一样,这意味着所有 synchronous elements 将在进程完成后立即具有其初始值(对于 Ultrascale 及更高版本,或者如果设置了 RESET_AFTER_RECONFIG )但是有一些 synchronous elements 会响应的随机可能性到第一个 application logic的 clock cycle,其他元素不会。这种随机行为取决于第一个 clock 到达的时间以及 GWE 变为高电平的时间。因此,将 reset 正确应用于所有对这种不确定性敏感的 logic 非常重要。

加载 partial bitstream 后需要重置 reconfigurable logic 与 FPGA的 full configuration 后需要重置相同。然而,在 full configuration的情况下需要重置更为直观,特别是因为 reset 通常保持活动状态,直到某些 logic elements 稳定(例如 MMCMs 或 PLLs 被锁定,外部硬件准备好等)。

总而言之,关于是否重置 reconfigurable logic以及它的哪些部分没有单一的答案。就像 full configuration一样, synchronous elements 被赋予其默认值并开始响应 clocks。这在某些情况下已经足够了,而在其他场景中则需要 reset 。

检测 STARTUP的末端

在上面列出的阶段中,唯一不受 application logic控制的部分是 STARTUP sequence。尽管如此,重要的是要知道它何时完成。

每个 FPGA 系列的 Configuration Guide 中都有 STARTUP sequence 的描述,但长话短说,这个序列所需的时间很大程度上取决于 bitstream的 options 。例如,可以将序列配置为等待 MMCMs 锁定,或等待 DCIs 完成其 impedance matching。

FPGA 提供一个信号 End Of Startup (EOS),在 STARTUP sequence 的最后阶段(即当此序列完成时)变为高电平。依靠 EOS 是通过启动 reset 并启动 output ports的 recoupling 来判断何时恢复 reconfigurable logic 的正式正确方法。

EOS 信号只能从 logic fabric内部获得,一个 instantiation 一个 STARTUPE2 primitive,可能如下:

wire eos;

STARTUPE2 #(.PROG_USR("FALSE")) startup_ins
  (
   .CLK(1'b0),
   .GSR(1'b0),
   .GTS(1'b0),
   .KEYCLEARB(1'b1),
   .PACK(1'b0),
   .USRCCLKO(1'b0),
   .USRCCLKTS(1'b0),
   .USRDONEO(1'b1),
   .USRDONETS(1'b1),
   .CFGCLK(),
   .CFGMCLK(),
   .EOS(eos),
   .PREQ());

所以当 bitstream 完成加载到 ICAP后,等待 EOS 变高,然后再开始 reset 和 recoupling。

Ultrascale FPGAs 有一个 STARTUPE3 primitive 代替,但是 Vivado 也接受这些 FPGAs 的 STARTUPE2 primitives ,并将它们正确转换为 STARTUPE3。所以上面的代码示例涵盖了所有 FPGA 系列。

我做了一些轶事测试来测量 bitstream的 START 命令到达 ICAP后 EOS 变为高电平需要多长时间。

对于 Kintex-7,使用 bitstream的默认设置,这需要 26 clock cycles (在 100 MHz,因此 ~260 ns)。由于 bitstream中还有其他数据,其中包括 NOPs, EOS 很可能在 bitstream 的最后一个字被输入 ICAP后很快就变为高电平。

但是使用 Kintex Ultrascale FPGA 进行的相同测试产生了完全不同的结果: 在 START 命令之后, EOS 在 0.8 ms 到 4.5 ms 之间的某个位置随机变为高电平。

尽管如上图所示使用 STARTUPE2 primitive 非常容易,但也可以在 bitstream 完成加载后的固定时间后启动 recoupling 。例如,很难想象 STARTUP sequence 会像 100 ms一样长,但对于人类来说,它实际上是一个不为人知的 delay 。但是,考虑到上面给出的两个测试结果,使用 STARTUPE2 primitive 似乎是安全的方法。

至于 Ultrascale FPGAs,加载 clearing bitstream 后 EOS的行为显然没有记录。但是在一个轶事测试中,它在加载 clearing bitstream后保持低位,并在随后加载 partial bitstream 后变为高位。


第三篇文章到此结束。最后一篇文章介绍了 Vivado 如何通过 OOCs 和 DCPs处理 static logic 和 reconfigurable logic 之间的关系,以及如何理解这一点,以便为 Remote Update 场景生成 partial bitstreams 的可靠方法。

此页面由英文自动翻译。 如果有不清楚的地方,请参考原始页面
Copyright © 2021-2024. All rights reserved. (6f913017)