序章
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 は SERDESなどのより大きな logic elementの一部です。したがって、 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 が正しく、外部コンポーネントとのインターフェイスが適切に計画されている限り、これは問題ではありません。ただし、このような問題が存在する場合、 implementation と次の delay の違いによって混乱が生じる可能性があります。 何かがうまくいかず、 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]
もう 1 つのオプションは、 inputに接続されている register に synthesis attribute を追加することです。
(* IOB = "TRUE" *) reg the_input_samp;
XDC ファイル内の attribute では不十分な場合があることに注意してください。 多くの場合、 synthesizer は、 flip-flops を IOBに入れるために registers を複製する必要があります。これは、 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の可能な位置は 1 つしかありません。 timing constraintsの有無にかかわらず、 timing は常に同じであると結論付けても安全ではないでしょうか?
そのため、 IOB registers が使用されている場合でも timing constraints を記述するのには、主に 2 つの正当な理由があります。
最初の理由は、 IOB register が使用されていることを確認することです。 場合によっては、 logic design の変更により、 portsのすべてまたは一部で IOBs を使用できなくなることがあります。これが発生したときにツールが文句を言うことはめったにありません。むしろ、 IOB の内部にない flip-flop は黙って使用されます。 timing constraint は、この状況を防ぐことができます。 関連するすべての flip-flops が IOBs内にある場合にのみ timing constraint を実現できる場合、これらの flip-flops の削除はサイレントではありません。 その結果、 timing constraint は失敗します。
2 つ目の理由は、ツールが 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の繰り返し可能な動作も得られます。