良い質問。
私は完全な解決策を知りませんが、ここに2つの部分的な戦略があります...
コンポーネントの相互接続...コンポーネントがパイプラインの深さを値とするジェネリックをエクスポートできれば、本当に素晴らしいでしょう。残念ながら、それはできません。これにポートを割り当てるのはばかげているようです(おそらく実行可能ですが、整数定数になるため、合成では消えます)。
それができない場合は、このモジュールの予算を示すジェネリックを渡します。モジュール内で、予算を満たせない場合はアサート(重大度FAILURE)します...(このアサートはシンセ時にチェック可能であり、少なくともザイリンクスXSTは同様のアサートを処理します)
予算を難しい数値にし、実際のパイプラインの深さと等しくない場合はアサートするか、予算が大きすぎる場合はモジュール内にパイプステージを追加し、予算が小さすぎる場合にのみアサートします。
このようにして、予測可能なモジュールを接続し、トップレベルでパイプライン演算を実行してバランスをとることができます(たとえば、計算された定数値をプログラム可能な遅延線に渡す)
コンポーネント内で...私は単一のプロセスを使用し、レジスターはパイプステージを反映する名前の内部信号として表されexponent_1, exponent_2, exponent_3
ます。プロセス内で、最初のセクションは最初のサイクルのすべてのアクションを説明し、2番目のセクションは2番目のサイクルを説明します。通常、「より簡単な」パスは、クリティカルパスと同期するために、そのまま次のパイプステージにコピーされます。プロセスはかなり整理されており、保守が簡単です。
32ビットの乗算を16*16のチャンクに分割し、部分的な積の追加をパイプライン処理する場合があります。これが与えるコントロール、XSTが単独で与えるよりも良い結果を与えるために使用されます...
プロセス内で変数を好む人がいることは知っています。パイプステージの中間結果にそれらを使用しますが、シグナルを使用すると、パイプラインを自然な順序で記述できます(割り当ての延期のおかげで)が、変数を使用する場合は、それを記述しなければなりません。後ろ向き!