大きいFPGAでリソース90%以上使ってて、クロックもたくさんあると、配置配線の自由度がかなり厳しくて死ぬ。
ので、なんとかしたときのお話。
あくまで仮説ベースで「雑にやってみたらなんとなく良かった」系の話です。数年前なので最近はどうか知らない。
前提:非同期リセット → シンクロナイザー → 同期リセットという基本構成について
外部リセットは非同期なので、まずはシンクロナイザーを通して同期化します。
(ちなむと、シンクロナイザーはベンダーのマクロ/IPを使うのが最も安全なはず。オレオレシンクロナイザー死すべし(何度でも生き返るが…))
問題はその後、同期リセットは多くのモジュールに配られるため、ファンアウトが爆発します。
巨大FPGAでは、リセットネットがすごい距離飛んでたりしません?
それからクロックが大量にあってそれぞれに同期リセットが存在している状況だと配置配線の自由度が一気に奪われる気する。
仮説:モジュール側でリセット入力レジスタでいい感じに距離を渡ってくれるんでは?
→ いい感じになる。
問題に対応するための雑な仮説ですが、これが意外とうまくいく(逆に合成・配置配線ツールの方でよしなに複製しろやって気もする(今は考えなくてもいいのかもしれない))。
つまり、巨大ファンアウトを小さな局所ファンアウトの集合に変換するイメージ。
注意点としては、各モジュールの同期リセットの入力レジスタは都度実装するけど、そのレジスタの複製もマージも合成ツールにおまかせするということと、シフトレジスタを作らせないようにする、ということです。
(dont_touchなどはマージが効かなくなるのでつけない、かつSRL_STYLEとかAUTO_SHIFT_REGISTER_RECOGNITIONでシフトレジスタ抑制→参照 https://qiita.com/nv-h/items/3968f033404ca7e3704b)
まぁまぁ直感どおりではあるけど非本質部分でつらいので、ツールがもうちょっと賢くなっててほしかった…