連載
» 2007年10月31日 00時00分 公開

メモリ容量やDSPブロックを減らすには?FPGA開発テクニック、チューニングの心得(3)(1/2 ページ)

前回に続き、集積効率のよい結果を引き出すチューニングとメモリ・ブロックやDSPブロックの使用量を減らすチューニングを行う。

[島田順二(アルティマ),@IT MONOist]

 前回に引き続き、「集積効率のよい結果を引き出すには?」をテーマにアルテラの開発ツール「Quartus® II」に含まれるAdvisor機能を紹介します。また、後半では「メモリ容量やDSPブロックは減らせるか?」についても解説します。

 今回も前回と同様、サンプル・デザイン(des.lzh)を使用して解説を進めていきます。



編注:本連載では、アルテラの開発ツールQuartus IIを使用したチューニングのポイントについて解説します。

Logic Elementをどこまで減らせるか?

 前回は「Resource Optimization Advisor」の「Stage 1」にある“Use register packing”を設定し、Logic Elementを削減しました。

 今回は残りのStage(「Stage 2」と「Stage 3」)で、どこまでLogic Elementを削減できるのかについて検証していきます。

Stage 2の設定

 それでは、「Stage 2」から見てみましょう。

 「Stage 2」は図1のように3つの設定があります。まずは、それぞれの項目について確認していきます。

図1 「Resource Optimization Advisor」の「Stage 2」の内容

1.Change synthesis options

 ここでは論理合成のオプション設定を変更します。オプションは4種類ありますが、4つ目の「Remove Redundant Logic Cells」が推奨設定である「ON」になっていないことが分かります(図2)

図2 「Change synthesis options」の設定内容 (画像をクリックすると拡大します)

 「Remove Redundant Logic Cells」とは、冗長な(Redundant)ロジックを消去する機能です。Quartus IIは回路を論理合成する際、ロジックを複製させて動作スピードを上げる場合があります。現状では、動作スピードに関する設定は行っていないので、この設定を推奨の「ON」にしても結果の改善は期待できないと判断できます。

2.Turn on allow any size for ROM/RAM/Shift Register Recognition

 Quartus IIはデザイン上で小さな容量や規模のROMやRAM、シフト・レジスタを見つけるとメモリ・ブロックではなくロジック・エレメントに配置します。

 前回も例に挙げたCyclone® IIIデバイスには、M9Kという9Kbitsのメモリ・ブロックがありますが、これを利用して数十bits程度のメモリを構成するといった行為は非常にもったいないので、仮にユーザーがメモリの記述をしていても、Quartus IIが自動的にロジック・エレメントを使用するようにします。

 この設定は、小さなROM/RAM/シフト・レジスタもロジック・エレメントではなく、メモリ・ブロックに配置するようにします(図3)

図3 「Turn on allow any size for ROM/RAM/Shift Register Recognition」の設定内容
(画像をクリックすると拡大します)

 サンプル・デザイン(des.lzh)では数十bitsのROMを複数構成しています。また、メモリ・ブロックも使用していませんので、この設定は「有効」であると判断できます。

 そこで、今回は[Correct the Settings]ボタンをクリックして、この設定を有効にしてみます。

3.Turn on Fast Input/Output Registers

 アルテラのFPGAには、ロジック・エレメントにあるレジスタとは別にI/Oピンの直前にレジスタが配置されています。このレジスタを使用する設定が「Turn on Fast Input/Output Registers」になります。

 ここで注意しなければならないのが、デザイン上“レジスタとピンの宣言の間には組み合わせ論理が存在しないこと”が前提の設定になっています(図4)

図4 「Turn on Fast Input/Output Registers」の設定内容
(画像をクリックすると拡大します)

 こちらの設定はデザイン上にあるレジスタに対して、1つ1つFast Input/Output Registerの設定をします。今回、この設定については割愛しますが、入力ピンに入ってからすぐにレジスタを宣言しているデザイン、またはレジスタからすぐに出力ピンを宣言しているデザインには非常に有益な設定なので、自身のデザインでぜひ試してみてください。

 それでは、この状態でコンパイルして、結果は確認してみましょう(図5)

図5 設定後のコンパイル結果

:コンパイル方法については連載第1回「コンパイル時間を早めるには?」を参考にしてください。

 前回の図18(「Stage 1」まで施した結果)と比べてみてください。Total Logic Elementsの使用個数が「3992個」から「3880個」へと112個減少していることが分かります。さらに、Total Memory bitsが「512bits」増えています。これは「Turn on allow any size for ROM/RAM/Shift Register Recognition」の設定によってロジック・エレメントで構成されていたROMの回路がメモリ・ブロックを使った結果を表しています。

 それでは、メモリ・ブロックをどのように使用しているか[Compilation Report]の[RAM Summary]で確認してみましょう(図6)

図6 RAM Summaryの結果表示 (画像をクリックすると拡大します)

 Mode=ROM、Port A Depth=64、Port A Width=1または2

と、なっています。

 これは“深さ64ワードで、データ幅が1または2bitsのROM”を構成したことを表しています。Cyclone IIIのメモリ・ブロックはM9Kという9Kbitsのブロックなので非常に小さな容量しか使用していません。今回のデザインではわずかな使用構成の転換ではありますが、有効な設定結果となりました。

Stage 3の設定

 さらに、「Stage 3」の設定を確認していきましょう。「Stage 3」には2つの設定があります
(「Flatten the hierarchy」は(チェックマーク)になっているので、説明を割愛します)。

1.Minimize state machine encoding

 ここでは、ステート・マシンのエンコーディング方法を変更します。ステート・マシンとは状態遷移図のことで、ハードウェア言語で回路を記述している場合、よく用いられる記述方法です(図7)

図7 「Minimize state machine encoding」の設定内容 (画像をクリックすると拡大します)

 今回のサンプル・デザインでは、ステート・マシンを記述していないので、設定の効果はありません。

2.Turn on Ignore CARRY/CASCADE/LCELL Buffers

 デザイン上でCARRY/CASCADE/LCELLのバッファを宣言している場合、そのバッファを無視する設定です。

 今回のサンプル・デザインでは、これらのバッファを呼び出してはいないので同様に効果がないと考えられます(図8)

図8 「Turn on Ignore CARRY/CASCADE/LCELL Buffers」の設定内容
(画像をクリックすると拡大します)

 以上のように、「Stage 3」には特に有効と思われる設定はありませんでした。「Stage 1〜3」で紹介した設定以外でもロジック・エレメントの数が下がる可能性はありますが、今回の結果からサンプル・デザインのロジック・エレメントの下限は「3880個」程度であると考えられます。

 さて、Logic Elementの項目をまとめると、

  • 組み合わせ論理のみ、あるいはレジスタのみの回路構成が多い場合、使用率が下がる可能性がある
    「Stage 1」の「Use register packing」を試してみる


  • 数十bitsのメモリを構成しており、かつロジック・エレメントを使用している場合、使用率が下がる可能性がある
    「Stage 2」の「Turn on allow any size for ROM/RAM/Shift Register Recognition」を試してみる

などの設定で、効果が期待できます。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.