소개
FPGA에서 모든 I/O port는 logic fabric에 자체 작은 영역이 있습니다. IOB (Input / Output Block)라고 하는 이 영역에는 이 I/O port의 기능을 지원하는 데 필요한 모든 것이 포함되어 있습니다. I/O pin와 몇 가지 특별한 logic elements에서 정확한 전압과 전류를 보장하는 아날로그 회로.
"IOB"라는 용어는 AMD (이전에는 Xilinx)에서 사용하는 용어에 속한다는 점을 지적해야 합니다. 각 FPGA 공급업체는 다른 용어를 사용합니다.
IOB내부에는 거의 항상 IOB registers가 있습니다. 이 registers는 I/O port의 pin에 직접 연결된 flip-flops 입니다.
일부 flip-flops는 pin이 input port일 때 사용하기 위한 것입니다. 이 flip-flops의 D input은 I/O port의 pin에 연결됩니다. 따라서 이런 종류의 flip-flop은 외부 세계에서 도착한 signal 의 sampling을 수행합니다.
다른 flip-flops는 output port로 pin 전용입니다. 이 flip-flops의 Q output은 pin에 연결됩니다.
IOBs 의 구조는 FPGA 마다 다릅니다. 일부 IOBs는 복잡하고 기능이 풍부하며 다른 IOBs는 구조가 더 간단합니다. 종종 IOB register는 더 큰 logic element(예: SERDES)의 일부입니다. 따라서 IOB를 설명하는 문서의 그림에 flip-flops가 명시적으로 설명되어 있지 않더라도 FPGA의 I/O pins 에 IOB registers가 있을 가능성은 여전히 있습니다.
IOB registers를 사용하는 이유
IOB registers를 사용하는 주요 동기는 timing입니다. 이러한 registers는 I/O port의 pin와 유사하기 때문에 이러한 방식으로 달성된 clock-to-output은 타의 추종을 불허합니다. 또한 input ports의 경우 IOB register가 필요한 timing을 달성할 수 있는 가장 좋은 기회를 갖습니다.
하지만 timing requirements를 만나는 것이 쉬운 경우에도 IOB registers를 고집하는 데는 충분한 이유가 있습니다. 반복성. 그렇지 않으면 I/O port의 pin 와 flip-flop 사이의 delay은 FPGA 프로젝트의 각 implementation 마다 다릅니다. 이는 도구가 flip-flop을 매번 다른 위치에 놓을 수 있기 때문입니다. 또한 timing constraints가 달성되는 한 routing delay 도 변경할 수 있습니다. PCB design이 올바르고 외부 구성 요소와의 인터페이스가 적절하게 계획되어 있는 한 이는 문제가 되지 않습니다. 그러나 이러한 문제가 존재하는 경우 delay 와 implementation 간의 차이로 인해 혼란이 발생할 수 있습니다. 뭔가 작동하지 않고 design에서 무언가를 수정하면 문제가 해결되는 것 같습니다. 그러나 실제로 차이를 만든 것은 I/O timing 어딘가에서 약간의 변화였습니다.
IOB registers를 사용하면 FPGA의 logic개발 프로세스 중에 외부 구성 요소와의 전기 인터페이스가 의도하지 않게 변경되지 않습니다. 이렇게 하면 문제가 발생할 때 쉽게 격리할 수 있습니다.
IOB registers요청
FPGA tools 에 IOB registers를 사용하도록 명시적으로 알려야 할 수도 있습니다. synthesizer가 이를 담당하는 경우가 많으므로 이런 종류의 synthesis attribute을 Vivado와 함께 사용할 수 있습니다.
(* IOB = "TRUE" *) input the_input,
XDC 파일에서도 동일한 작업을 수행할 수 있습니다.
set_property IOB true [get_ports the_input]
또 다른 옵션은 input에 연결된 register 에 synthesis attribute을 추가하는 것입니다.
(* IOB = "TRUE" *) reg the_input_samp;
XDC 파일의 attribute 만으로는 충분하지 않을 수 있습니다. 종종 flip-flops를 IOB에 넣기 위해 registers를 복제하려면 synthesizer가 필요합니다. 이것은 flip-flop 의 output이 FPGA의 일반 logic 에서도 사용되는 경우와 관련이 있습니다. 그 이유는 IOB 내부에 있는 flip-flop 의 output은 port에서만 사용할 수 있기 때문입니다. 따라서 동일한 output을 생산하려면 다른 flip-flop이 필요하므로 logic fabric에서 사용할 수 있습니다. synthesis attribute (위에 표시된 대로)는 종종 이 상황에서 필요합니다.
Quartus를 사용하면 이런 종류의 commands를 QSF 파일에 추가할 수 있습니다.
set_instance_assignment -name FAST_INPUT_REGISTER ON -to the_input set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to the_output
각 도구에는 이를 달성하는 방법이 약간씩 다릅니다.
Timing constraints
IOB register를 사용하는 port 에 timing constraints를 쓸 이유가 있나요? 결국 IOB register의 가능한 위치는 하나뿐입니다. timing constraints가 있든 없든 timing은 항상 동일할 것이라고 결론을 내리는 것이 안전하지 않습니까?
따라서 IOB registers가 사용되는 경우에도 timing constraints를 작성하는 데에는 주로 두 가지 좋은 이유가 있습니다.
첫 번째 이유는 IOB register가 사용되는지 확인하는 것입니다. 경우에 따라 logic design 의 변경으로 인해 전체 또는 일부 ports에 대한 IOBs 사용이 의도치 않게 방지될 수 있습니다. 이 문제가 발생할 때 도구는 거의 불평하지 않습니다. 오히려 IOB 내부에 없는 flip-flop이 조용히 사용됩니다. timing constraint는 다음과 같은 상황을 방지할 수 있습니다. 모든 관련 flip-flops가 IOBs내부에 있을 때만 timing constraint를 달성할 수 있는 경우 이러한 flip-flops 의 제거는 자동으로 수행되지 않습니다. 그 결과 timing constraint가 실패합니다.
두 번째 이유는 도구가 I/O port의 pin 와 IOB register 사이에 의도적인 delay을 삽입할 수 있기 때문입니다(모든 FPGAs가 이 기능을 지원하지는 않음). 이 delay 의 목적은 thold 와 관련하여 timing을 개선하는 것입니다( Quartus의 이 예 참조). 이러한 원치 않는 조작은 이 추가 delay없이만 달성할 수 있는 timing constraint 로 방지할 수 있습니다.
set_max_delay은 일반적으로 IOB registers의 일관된 사용을 보장하는 데 적합한 timing constraint 입니다. FPGA tools가 이 command (또는 유사한 기능)와 함께 "datapath_only" 옵션을 지원하면 더욱 편리합니다.
결론
가능하면IOB registers를 사용해야 합니다. FPGA tools는 이를 자발적으로 수행하지 않을 수 있으므로 이 목표를 달성하려면 약간의 노력이 필요할 수 있습니다. 이러한 노력에 대한 보상은 최적의 timing일 뿐만 아니라 I/O ports의 반복 가능한 동작이기도 합니다.