이것은 Partial Reconfiguration또는 Dynamic Function eXchange (DFX) 와 Xilinx의 Vivado에 대한 4개의 시리즈 중 세 번째 게시물입니다. 앞의 두 개는 FPGA design을 설정하는 방법을 보여주지만, 이번 항목에서는 static logic이 reconfigurable logic이 사라지고 다시 나타나는 데 대처하는 방법에 대해 설명합니다.
개요
partial bitstream을 로드하는 프로세스는 물리적 하드웨어의 hot swapping 와 유사합니다. 특정 부품이 갑자기 제거되고 다른 부품으로 교체되고 전원이 켜집니다. 이 게시물은 이러한 전환이 원활하고 안정적으로 이루어지도록 하는 데 필요한 수단에 대해 설명합니다.
이 게시물은 Partial Reconfiguration이 FPGA 자체에서 static logic 에 의해 수행된다고 가정합니다. 원활한 작동을 위해 다음 단계로 수행해야 합니다(설명은 다음과 같습니다).
- reconfigurable logic을 안전한 상태로 전환하여 재설정해도 outputs의 영향을 받는 항목을 혼동하지 마십시오.
- reconfigurable logic용 reset signals를 활성화합니다.
- decoupling을 시작합니다.
- partial bitstream을 ICAP에 로드합니다.
- configuration의 STARTUP sequence가 완료될 때까지 기다리십시오.
- decoupling을 비활성화합니다.
- reconfigurable logic에 대해 reset signals를 비활성화합니다.
decoupling의 필요성
partial bitstream을 로드하는 동안 static logic 와 reconfigurable logic 간의 연결이 예측할 수 없는 상태에 있습니다. 결과적으로 reconfigurable module의 output ports는 random patterns 또는 잘못된 값을 생성할 수 있습니다. 이것은 항상 모든 output port 에서 발생하는 것은 아니지만 이상한 동작이 나타날 가능성이 있습니다.
static logic은 partial bitstream을 로드하는 것과 상관없이 계속 작동하므로 부작용을 피하기 위해 reconfigurable module에서 도착할 수 있는 예측할 수 없는 신호를 무시해야 합니다. Xilinx의 사용 설명서 UG909에서는 이것을 decoupling라고 합니다.
decoupling을 구현하는 방법은 reconfigurable module의 output ports특성에 따라 다릅니다. 이러한 각 ports가 static logic 에 미치는 영향을 분석하고 필요한 경우 예방 조치를 취해야 합니다. 이것은 예를 들어 reconfiguration동안 중립 값을 가진 output ports 의 multiplexing , 응답하지 않아야 하는 logic 에 clock-enable을 추가, 또는 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는 AXI 연결의 decoupling을 위해 Vivado의 IP Catalog 에서 사용할 수 있습니다.
reconfigurable module의 input ports는 그런 처리가 필요하지 않습니다. static logic은 구동하는 신호가 소비되지 않는 것을 신경 쓰지 않습니다.
Ultrascale 장치와 관련하여 reconfigurable logic을 종료하기 때문에 "clearing bitstreams"를 로드하기 전에 decoupling이 필요합니다.
STARTUP sequence에 대한 몇 마디
bitstream (full 및 partial)에서 중요한 부분 중 하나는 STARTUP sequence를 시작하는 START configuration command입니다. 이 시퀀스에는 logic의 일관된 bring-up을 위한 몇 가지 메커니즘이 포함됩니다.
첫 번째 부분은 synchronous elements가 configuration의 끝에서 기본값이 할당된다는 것입니다. 이것은 Ultrascale FPGAs 이상에서 항상 적용됩니다. Series-7 FPGA에서는 full configuration (즉, initial bitstream포함)와 RESET_AFTER_RECONFIG이 활성화된 경우 Partial Reconfiguration 에 해당됩니다.
그런 다음 두 번째 부분은 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 와 관련하여 비동기식이므로 이 변경과 첫 번째 유효 clock 사이의 timing은 모든 synchronous element에 대해 예측할 수 없습니다.
Partial Reconfiguration 시나리오에서 full configuration와 마찬가지로 이는 모든 synchronous elements가 프로세스가 완료된 직후( Ultrascale 이상 또는 RESET_AFTER_RECONFIG이 설정된 경우) 초기 값을 갖게 되지만 일부 synchronous elements가 응답할 가능성이 무작위로 있음을 의미합니다. 첫 번째 application logic의 clock cycle로, 다른 요소는 그렇지 않습니다. 이 임의의 동작은 GWE가 높음으로 변경되는 시점과 관련하여 이 첫 번째 clock이 도착하는 시점에 따라 다릅니다. 따라서 이러한 불확실성에 민감한 모든 logic 에 reset을 적절하게 적용하는 것이 중요합니다.
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 신호는 다음과 같이 STARTUPE2 primitive의 instantiation 와 함께 logic fabric내부에서만 사용할 수 있습니다.
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가 high로 변경되는 데 걸리는 시간을 측정하기 위해 몇 가지 일화적인 테스트를 수행했습니다.
Kintex-7의 경우 기본 설정이 bitstream인 경우 26개의 clock cycles가 필요했습니다( 100 MHz에서 ~260 ns). bitstream, 특히 NOPs에 추가 데이터가 있었기 때문에 bitstream 의 마지막 단어가 ICAP에 공급된 직후 EOS가 high로 변경되었을 가능성이 큽니다.
그러나 Kintex Ultrascale FPGA를 사용한 동일한 테스트에서는 완전히 다른 결과가 나타났습니다. START 명령 후 high로 변경하기 위해 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를 생산하는 신뢰할 수 있는 방법에 대해 설명합니다.