VHDLのマクロセル消費最適化

  • 投稿日:
  • 更新日:2009/02/11
  • by
  • カテゴリ:

いろいろトライ&エラーで、最適化の方法がだんだんわかってきました。

一番簡単なのは、「出力信号ごとにプロセスを分ける」ということです。

たとえば、昨日の例なら、次のようにします。

  process (ATOB, G)
  begin
    if G = '0' and ATOB = '0' then
      BUSA <= "ZZZZZZZZ";
      Reg <= BUSA;
    elsif G = '0' and ATOB = '1' then
      BUSA <= BUSB;
    else
      BUSA <= "ZZZZZZZZ";
    end if;
  end process;  process (ATOB, G)
  begin
    if G = '1' and ATOB = '1' then
      BUSB <= Reg;
    else
      BUSB <= "ZZZZZZZZ";
    end if;
  end process;
  

ただし、この例は簡単すぎるので、マクロセルを含めリソースの消費量は変わりません。

あと、バスに複数の信号を選択的に入れたい場合、マルチプレクサが挿入されます。 マルチプレクサ一つにつきマクロセル一つを消費するようで、今回の試作ではこれが大きく響いています。 2つある8ビットのデータバスの両方とも、複数のデータソースを持つためです。

実際にはフィッティング時の最適化で、「必ずこれによりマクロセルを消費する」ということは言えないようですが。 わかっている範囲で、単体でマクロセルを消費するロジックは以下のとおりです。

  • マルチプレクサ
  • 3ステートバッファ
  • XORゲート

レジスタは必ずしも単体でマクロセルを消費しないようです。

こんな感じで最適化を行った結果、次のようになりました(XC9536ではオーバーしてフィッティング結果が出ないので、XC9572でフィッティングを行っています)。

Macrocells     Product Terms    Function Block   Registers      Pins           
Used/Tot       Used/Tot         Inps Used/Tot    Used/Tot       Used/Tot       
42 /72  ( 58%) 96  /360  ( 27%) 77 /144 ( 53%)   16 /72  ( 22%) 31 /34  ( 91%)
  

マルチプレクサを低レベルのロジックで手組みすると、少し減ります。 すなわち、

if COND1 = '0' and COND2 = '0' then
  BUSA <= BUSB;
elsif COND3 = '0' and COND4 = '0' then
  BUSA <= Reg;
end if;
  

とする代わりに、

if (COND1 = '0' and COND2 = '0') or (COND3 = '0' and COND4 = '0') then
  BUSA(7) <= ((COND1 nor COND2) and BUSB(7)) or ((COND3 nor COND4) and Reg(7));
  BUSA(6) <= ((COND1 nor COND2) and BUSB(6)) or ((COND3 nor COND4) and Reg(6));
  ...
end if;
  

のように、低レベルな記述に手で変換してやります。 すると、以下のようになりました。

Macrocells     Product Terms    Function Block   Registers      Pins           
Used/Tot       Used/Tot         Inps Used/Tot    Used/Tot       Used/Tot       
40 /72  ( 56%) 94  /360  ( 26%) 82 /144 ( 57%)   16 /72  ( 22%) 31 /34  ( 91%)
  

目標とするマクロセル数は36。惜しいですねぇ。


こちらもよく読まれています