新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

Polyphony のパイプライン

高位合成コンパイラ から データ・フロー・コンパイラ

Polyphony では pipeline というキーワード(もっと正確な単語を考えないと)、で処理をパイプライン化することが出来るようになった。これはいつ入ったか忘れたけど、v0.3.6 からか?v0.3.5 が 2019/5/9 で v0.3.6 が 2019/5/30 でそもそも現バージョンはパンデミック前の 4年前。そろそろちゃんと v0.3.7 出さないとね。

pipeline

Polyphony は単なる高位合成ではなく、データ・フローをかなりしっかりおっている。なので、データ・フロー・コンパイラと呼びたい(勝手に呼んでいるだけ)。どれくらいしっかりおっているかというと、pipeline 化する時に for 文の展開をかなり真面目にやっている。

例えば、for 文による多重ループ。これがあると単純には pipeline 化出来ない。そこで多重ループを1重ループに展開している。

if 文は以前から mux 化(ハードウェア化)している。 なので if 文による分岐という概念はない。データ・フロー的にも for 文の中に if があっても大丈夫なように設計されている。

コンパイルはフェーズの最初では if などは then と else のブロックに別れているが、多重ルールの展開など、様々なパスを経るうちにブロックというよりデータ中心のデータ・フローが出来上がる。

中間的にはデータフローを考慮した IR ぽい形になって、抽象的な HDL となり、最終的に Verilog-HDL に出力される。

MyHDL 的なものとの整合性

pipeline 化すると、外部のインタフェースとうまく適合して、効率よくデータの受け渡しが出来るようになりたい。そうすると、どうしても Python の関数インタフェースでは表現できない。結果として、MyHDL がそうであったように、signal 的あるいは wire 的なオブジェクトを生成し、それを I/F とする、、、という手法に向かう。

でも、それってダサくない?

結局、Verilog-HDL を Python や C で書き下すような感じなる。つまり Verilog-HDL でこういう I/F になるはずだよねという事を想像しながら、その HDL コンパイラ独自のデータ変換方法に合わせて記述をしていく。プログラムが持つ本質の I/F で表現されることなく、表面上の記述変換をするはめになる。

現時点で良いアイデアはないのだが、とりあえず github にある Polyphony の開発途中のバージョンのブランチでは、よりうまくその手の I/F を記述可能になりつつある。出来たら v0.4 になるのかな?