FPGAの動作周波数を上げる5つの方法
Advanced FPGA Design: Architecture, Implementation, and Optimizationに載っている5つの方法を紹介します。
→以下が私のコメントです。
1.レジスタの層を増やす
A * X + B * X1 + C * X2のような演算を1CLKで実行している所があればレジスタを入れて演算を区切る。A * X、B * X1、C * X の乗算を1CLKで行い、次のCLKで3つの加算を行うようにすれば、動作周波数が上がる。
→とりあえずFFを追加して4.レジスタバランスに任せるという手もある。
2.並列に演算できる部分を切り出す
たとえば、8bitの乗算を上位下位それぞれ4bitにわけ、1CLK目で上位、下位、および組み合わせでそれぞれ乗算する。次のCLKで、それぞれをBitシフトして足せば動作周波数があがる。
→単純な乗算であれば、MegaWizard等のGUIツールで設定すればレイテンシーにあわせて動作周波数を上げてくれる。ただし、周波数が上がる理由は押さえておくべき。
3.ロジックを平坦にする
if(ctrl[0])rout[0] <= in;
else if(ctrl[1])rout[1] <= in;
else if(ctrl[2])rout[2] <= in;
else if(ctrl[3])rout[3] <= in;
というようなロジックに対し、ctrl[3:0]が2bit立つことが絶対にないのなら、elseは不要。
if(ctrl[0])rout[0] <= in;
if(ctrl[1])rout[1] <= in;
と最適化でき、動作周波数を上げられる。
→今のツールがやってくれない最適化なので、自分でやらないといけない。回路図入力の世代は余裕でできるので、一度教わると良い。
4.レジスタバランスの機能を使う
論理が変わらない範囲で、レジスタの前後にロジックを振り分けて動作周波数を上げることができる。論理合成ツールの最適化オプションで設定できる。
→マッピング後にノードが見つからないとか、信号を引き出した時点で最適化を妨げるので、何をしているかの理解は必須。
5.パスの再配置
if文の優先順位を入れ替えることで、動作周波数を上げることができる。
if(cond1) Out <= A;
else if(Cond2 && (C < 8)) Out <= B;
eles Out <= C;
このようなif文に対して、cond1と、Cond2 && (C < 8)を入れ替えることで動作周波数が上がることがある。
→ 動作速度ぎりぎりの回路を作る時には必須の知識。3.ロジックを平坦にする と同じく、○○と△△が同時に真になることはない等論理合成ツールが知り得ない情報を使用する必要がある。デコード条件を減らすために、ステートマシーンを手で書いたワンホットにすると効果大。タイミングレポートを見ながら、レジスタに入る入力数を数えていると、自然にできるようになる。当然ながら保守性は落ちるので、ソースにコメント入れるなり、何かしらのアサーションを入れておきましょう。
ここに書かれていない簡単な手動最適化だと、カウンターを一つ前の値と比較するってのがある。ダウンカウンターがあるとして、if(count==0)のような比較を行うと、カウンターのビット数がそのまま入力ロジックになってしまう。そこで次が0なら1になるレジスタnext_count_equal_zero <= (count == 1) ? 1 : 0;を作る。そうするとif(count==0)がif(next_count_equal_zero)の1bitの比較になるので、入力信号がずいぶんと減る。高速のメモリコントローラでバースト長を数える時などに使う。これは、ある条件下(バースト転送中等)ではcountの値が1の次は必ず0になるという、合成ツールが知りえない情報を使用して最適化をしている。
ほかにもちょこちょこあるけど、今日はここまで。FPGAに限っていえば周波数をあげるというのはFFへの入力を減らすとほぼ等価なので、回路図入力で設計経験があるベテランエンジニアに聞くといろんなことを知っている。
この本はここまでたった16ページ。全てVerilogソースと、合成後の回路図付き。すばらしい。
The comments to this entry are closed.
Comments