这是关于 Partial Reconfiguration或 Dynamic Function eXchange (DFX) 与 Xilinx的 Vivado的系列四篇文章中的第三篇。前两个展示了如何设置 FPGA 设计,而这个讨论了静态逻辑(static logic)如何应对 reconfigurable 逻辑消失和重新出现。
概述
加载 partial 比特流的过程与物理硬件的 hot swapping 类似: 某个部件被突然移除,被另一个部件替换,然后通电。这篇文章讨论了确保这种过渡顺利可靠地进行的必要手段。
这篇文章假设 Partial Reconfiguration 是由静态逻辑在 FPGA 本身上执行的。为确保顺利运行,应按以下阶段进行(说明如下):
- 将 reconfigurable 逻辑置于安全状态,因此重置它不会混淆受输出(outputs)影响的任何东西。
- 为 reconfigurable 逻辑激活复位信号(reset signals)。
- 启动 decoupling。
- 将 partial 比特流装入 ICAP。
- 等待 configuration的 STARTUP 顺序完成。
- 禁用 decoupling。
- 为 reconfigurable 逻辑停用复位信号。
对 decoupling的需求
在加载 partial 比特流的过程中,静态逻辑和 reconfigurable 逻辑之间的连接处于不可预知的状态。因此, reconfigurable 模块的输出端口(output ports)可能会生成 random patterns 或非法值。这并不一定会一直发生在每个输出端口(output port)上,但很可能会看到某种奇怪的行为。
由于无论加载 partial 比特流,静态逻辑都会继续运行,因此有必要忽略可能来自 reconfigurable 模块的不可预测的信号,以避免任何不利影响。 Xilinx的用户指南 UG909将其称为 decoupling。
如何实现 decoupling 取决于 reconfigurable 模块的输出端口的性质: 应分析这些端口中的每一个对静态逻辑的影响,并根据需要采取预防措施。例如,这可能涉及输出端口的 multiplexing 在 reconfiguration期间具有中性值,将 clock-enable 添加到不应响应的逻辑,或在复位中保留静态逻辑的某些部分。
如果 reconfigurable 逻辑直接连接到 I/O pads,可能需要将它们置于 high-Z 模式或停用 I/O 逻辑的时钟使能(clock enable)(如果 I/O 逻辑包括输出寄存器(output register))。此外,如果 reconfigurable 逻辑连接到外部组件,则可能需要在 reconfiguration之前使这些组件进入安全状态。
Partial Reconfiguration Decoupler IP 在 Vivado的 IP Catalog 中可用于 decoupling 的 AXI 连接。
reconfigurable 模块的输入端口不需要这样的处理——静态逻辑并不关心它驱动的信号是否被消耗。
关于 Ultrascale 设备,在加载“clearing 比特流”之前需要 decoupling ,因为它们关闭了 reconfigurable 逻辑。
关于 STARTUP 顺序的几句话
比特流(bitstream)(full 和 partial)的一个重要部分是 START configuration 命令,它启动了 STARTUP 顺序。这个序列涉及到逻辑的一致 bring-up 的目的的几个机制。
第一部分是在 configuration的末尾为同步逻辑单元(synchronous elements)分配了它们的默认值。 Ultrascale FPGAs 及更高版本始终如此。在 Series-7 FPGA上,对于 full configuration (即带有 initial 比特流)和 Partial Reconfiguration (如果启用 RESET_AFTER_RECONFIG )是正确的。
然后第二部分是 GWE (全局写使能(Global Write Enable),不要与同步逻辑单元的使能输入(enable inputs)或 write-enable 输入混淆): 该信号允许触发器(flip-flops)和 RAMs 改变值。 GWE 在 full configuration期间在整 FPGA 上保持低位,并在 configuration startup 顺序期间的某个阶段变为高位。加载 partial 比特流时,只有 reconfigured 逻辑受到影响。
自然地, GWE 的更改相对于应用逻辑提供的任何时钟都是异步的,因此对于任何同步逻辑单元,此更改与第一个有效时钟之间的时序(timing)是不可预测的。
在 Partial Reconfiguration 场景中,就像 full configuration一样,这意味着所有同步逻辑单元将在进程完成后立即具有其初始值(对于 Ultrascale 及更高版本,或者如果设置了 RESET_AFTER_RECONFIG )但是有一些同步逻辑单元会响应的随机可能性到第一个应用逻辑的时钟周期(clock cycle),其他元素不会。这种随机行为取决于第一个时钟到达的时间以及 GWE 变为高电平的时间。因此,将复位正确应用于所有对这种不确定性敏感的逻辑非常重要。
加载 partial 比特流后需要重置 reconfigurable 逻辑与 FPGA的 full configuration 后需要重置相同。然而,在 full configuration的情况下需要重置更为直观,特别是因为复位通常保持活动状态,直到某些逻辑单元(logic elements)稳定(例如 MMCMs 或锁相环(PLLs)被锁定,外部硬件准备好等)。
总而言之,关于是否重置 reconfigurable 逻辑以及它的哪些部分没有单一的答案。就像 full configuration一样,同步逻辑单元被赋予其默认值并开始响应时钟。这在某些情况下已经足够了,而在其他场景中则需要复位。
检测 STARTUP的末端
在上面列出的阶段中,唯一不受应用逻辑控制的部分是 STARTUP 顺序。尽管如此,重要的是要知道它何时完成。
每 FPGA 系列的 Configuration Guide 中都有 STARTUP 顺序的描述,但长话短说,这个序列所需的时间很大程度上取决于比特流的 options 。例如,可以将序列配置为等待 MMCMs 锁定,或等待 DCIs 完成其 impedance matching。
FPGA 提供一个信号 End Of Startup (EOS),在 STARTUP 顺序的最后阶段(即当此序列完成时)变为高电平。依靠 EOS 是通过启动复位并启动输出端口的 recoupling 来判断何时恢复 reconfigurable 逻辑的正式正确方法。
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());
所以当比特流完成加载到 ICAP后,等待 EOS 变高,然后再开始复位和 recoupling。
Ultrascale FPGAs 有一 STARTUPE3 primitive 代替,但是 Vivado 也接受这些 FPGAs 的 STARTUPE2 primitives ,并将它们正确转换为 STARTUPE3。所以上面的代码示例涵盖了所有 FPGA 系列。
我做了一些轶事测试来测量比特流的 START 命令到达 ICAP后 EOS 变为高电平需要多长时间。
对于 Kintex-7,使用比特流的默认设置,这需要 26时钟周期(在 100 MHz,因此 ~260 ns)。由于比特流中还有其他数据,其中包括 NOPs, EOS 很可能在比特流的最后一个字被输入 ICAP后很快就变为高电平。
但是使用 Kintex Ultrascale FPGA 进行的相同测试产生了完全不同的结果: 在 START 命令之后, EOS 在 0.8 ms 到 4.5 ms 之间的某个位置随机变为高电平。
尽管如上图所示使用 STARTUPE2 primitive 非常容易,但也可以在比特流完成加载后的固定时间后启动 recoupling 。例如,很难想象 STARTUP 顺序会像 100 ms一样长,但对于人类来说,它实际上是一个不为人知的时延(delay)。但是,考虑到上面给出的两个测试结果,使用 STARTUPE2 primitive 似乎是安全的方法。
至于 Ultrascale FPGAs,加载 clearing 比特流后 EOS的行为显然没有记录。但是在一个轶事测试中,它在加载 clearing 比特流后保持低位,并在随后加载 partial 比特流后变为高位。
第三篇文章到此结束。最后一篇文章介绍了 Vivado 如何通过 OOCs 和 DCPs处理静态逻辑和 reconfigurable 逻辑之间的关系,以及如何理解这一点,以便为 Remote Update 场景生成 partial 比特流的可靠方法。