はじめに
論理合成ツールは、これまでほとんど使ったことがなく、論理合成ツールの性能がどのくらいなのか、ちょっとだけ試してみた。 もちろん人間が作った論理と比較して、人間が勝ったから、ブログに投稿しているわけで、この初戦の結果だけで判断しないようにお願いします。
論理合成ツール
XilinxのVivado 2018.2です。評価ボード Artyの(Artix-7 XC7A35T-L1CSG324I)の設定で合成しています。 合成オプションは、面積、最優先(Flow_AreaOptimaized_high)です。
論理合成対象
次のverilogのコード。使用するリソース、面積が最小となるように論理を作ります。
module s2add( input SW, input [3:0] A, input [3:0] B, input [3:0] C, input [3:0] D, output [3:0] O); assign O = SW ? A+B : C+D ; endmodule
論理合成ツールの結果
7 LUTです。面積的にはスライス2個分といったところでしょうか。
人間の結果
4 LUTです。面積的にスライス 1個に収まっています。(シミュレーションで正しい答えになることは確認しています)
まとめ
論理合成ツールに人間が勝ちました。ちょっと試してみただけの結果なので、これだけで判断しないようにお願いします。
追記
4bitの加算では人間が勝ちましたが8bitにすると論理合成ツールも人間と同じ結果を生成しました。
追記2
現在、開発中のICF3-Fはループ制御用に2本の16bitレジスタがあります。 同時にデクリメントすることはないので、この論理合成対象のように加算器を共有できます。 しかしならが共有できるようなverilogの記述をしても、うまく共有されず、論理合成ツールのほうが大きな面積となりました。 人間だと8スライスに収まりますが、論理合成ツールでは10スライスくらいになります。 verilogの記述を操作して共有できるようなコードを探すとなると、時間がかかるし、論理を追加していくうちに、再び共有されなくなる心配も考えるなら人間がやってしまったほうがいいように思いました。 人間がやるためにはLUTのデータを自分で作成する必要がありますが、FORTHライクな言語を自作しました。様々なLUTデータを簡単に作れます。
結局、最初の結論の通り、「論理合成対象のコードは、良くあるケースのように思うので、この結果は使えるのではと思います。」であります。
追記3
追記2の話を詳しくブログにしました。「FPGAで加算器を共有して面積を小さくする」