ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

加算器を作ろう 最後の高速化

最初に決めた条件をはずせるなら、さらに高速になる可能性があります。

FPGAを変える

まずオプションよりも何よりも一番効くのが「最速のデバイスにする」事です。アルゴリズムによる最適化を図る前に、最速のPCを買ってくるやり方です。現在入手可能な最速デバイスStratix3を使ってみましょう。特にデバイス依存の記述がなければ、このままQuartus2の設定を変えるだけです。

最後に作った加算器をStratix3に変更するだけで324.25MHzになります。

最適化のeffortを上げる

Stratix3を使い、さらに最適化のオプションをいろいろいじることで、374.53MHzまで速度があがります。

set_global_assignment -name AUTO_SHIFT_REGISTER_RECOGNITION OFF
set_global_assignment -name ENABLE_ADVANCED_IO_TIMING ON
set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
set_global_assignment -name STRATIXII_OPTIMIZATION_TECHNIQUE SPEED

ざっくりこんな感じです。最適化をきつくすると、FFで叩くだけの部分がシフトレジスタに最適化されて遅くなったので、AUTO_SHIFT_REGISTER_RECOGNITIONはOFFにしてあります。WYSIWYGの最適化はこのクラスの回路ではほとんど効果はありませんでした。WYSIWYG自体は大きい回路にはかなり有効なので、覚えておいて損はありません。

まとめ

結論から言うと、まずは+で加算器を作っても大丈夫です。最初の方に書きましたが、加算自体を1clkで終わらせるようにしておけば、加算器がボトルネックに入ってくることはまずありません。どうしても+では遅いときは、ALTERAデバイスの場合はlpm_add_subをlatency有りで使いましょう。それでも加算器がボトルネックに入るときは設計を見直しましょう。設計の見直しには、上位のFPGAに変更する事も選択肢に入ります。

ここまでの成果の一覧です。

adder Fmax(MHz)
Verilogの+ 187.06
マルチサイクル 348.68
lpm_add_sub 278.55
carry select adder 181.23
carry select adder(改) 248.2
手動チューニング 300.12
Stratix3(最適化OFF) 324.25
Stratix3(最適化ON) 374.53

Xilinxの場合はDSP48、DSP48EといったDSP elementが加算にも使えるので、別のアプローチが出てくると思います。こちらはXilinxが得意な人にお任せします。

ここまでの全ソースはこちらからダウンロードできます。
http://homepage3.nifty.com/~Natsutan/study/COAD/chap3/adder/adder.zip