FPU高速化
ちょっとインターフェースとかそのあたりの問題があったりなかったりということで、faddとfsubを書き直した。正確には、faddを作っただけなのだけれども、fsubは第二引数の最上位ビットにnotを入れるだけなので、大したことはない。
で、今更なのだけれども異符号の足し算(つまりは引き算)の回路はめちゃくちゃめんどくさい。そりゃ整数では2の補数表現とか使うよなあ。下手なことすると遅いんだもん。特に、桁が減るようなとき、例えば1.0-0.99のような近い数の除算はかなりめんどくさい。どれだけシフトしてやればいいのか分からないので、ループでまわしてやる必要があったりするのだけれども、ループは基本的に遅い。VHDLのループは、同じ回路を繰り返すのだから当然遅くなってしかるべきなんだけれども、致命的になりうる。
ということで、Tipsとして書いておくと、例えば00000000010000001000000というような数があったとして、これの最上位bitが1になるようにする方法を、
for i in 0 to 22 loop if 1bitシフト可能かどうか then 1bitシフトする end if; end loop;
というように1bitずつシフトするのではなくて、
if 16bitシフト可能かどうか then 16bitシフトする end if; if 8bitシフト可能かどうか then 8bitシフトする end if; if 4bitシフト可能かどうか then 4bitシフトする end if; if 2bitシフト可能かどうか then 2bitシフトする end if; if 1bitシフト可能かどうか then 1bitシフトする end if;
と書いたほうが速くなる。この規模で10ns程度は変わる。