IOレジスタへのパッキングについて色々調べたのでメモ。
FPGAをcompile(mapping)するときに、IO padの信号はなるべくI/O registerにパッキングした方がimingパフォーマンス的には望ましく、Timing制約を達成するうえでも有効。ただ、特に指定せずにコンパイルをかけるとI/Oレジスタにパッキングされないことがよくある。GUIからパッキングを指定する場合、processウィンドウの「Implement Design」→「Map」を右クリックして「Process Properties」を選択。すると以下のウィンドウが出てくる。Defaultだと、下の「Property display level」が「Standard」になっているので、ここを「Advanced」にして、「Pack I/O Registers/Latches into IOBs」を「For Inputs and Outputs」にしてApply。
(注意:上の画像は設定後にコンパイルした後の結果なので、コンパイル前とちょっと異なります)もっと明示的に指示したい場合は、ucfファイルの中に以下の条件
INST “****(階層を含むRegister名)” IOB = FORCE;
を書くことで、強制的にI/Oレジスタへのパッキングをさせることができる。I/Oレジスタのパック制御についてはこのARが詳しい。マッピング後ちゃんとIOレジスタにパッキングされているか確認する場合は
「Design OverView」タブ→「IOB Properties」
をクリックすると、各IOBについての詳細が見られる。この中で、「Reg(s)」の項に「IFF」(入力レジスタ)または「OFF」(出力レジスタ)がついていればパッキングされている。空白ならパッキングされていないので、設定を確認するべし。