FOSS でハードウェア開発を行う

ハードウェア開発につかうツールチェインはベンダー製ソフトウェアが多いが、 利用する FPGA によっては FOSS ツールチェインでも可能なようだ。

Fomu に載っている iCE40 はビットストリームの解析が完了しているため、 すべての工程を FOSS ツールで完結できる。

HDL の合成は yosys を使うことで行える。 yosys のマニュアルは長いのでちゃんと読んでいないが、 コマンドを入力していくことで様々な工程を実施できる。 この工程は TCL でスクリプト化することもできる。 また自分でスクリプトを組まなくても、ビルトインで良い感じの合成を行ってくれる synth_ice40のような便利コマンドも用意されている。

yosys にもシミュレーションを行う sim コマンドが用意されているが、 対応している機能が少ないようなのでテストベンチを書くには iverilog や verilator を使うのが良さそうだ。

iverilog は verilog シミュレータで verilog でテストベンチを記述するのに使える。 ただし即時 assert が master ブランチでしか使えないので注意が必要。 ハードウェア開発に詳しくないのだが、assert を使わずに波形を確認するほうが一般的なのかもしれない。 波形は gtkwave を使えば見ることができる。

verilator は合成可能な verilogC++コンパイルしてくれるシミュレータだ。 高速なのが売りらしく、公式サイトでは iverilog に比べて100倍高速とのことだ。 ハイレベルHDLのChicelはverilatorでのテストが可能になっていたりする。

ディジタル回路とコンピュータアーキテクチャで例に出されている sillyfunction を例に各ツールを試してみた。 https://github.com/toshipp/learn-verilog/tree/master/sillyfunction

make simで verilator を使ったシミュレーションを行うことができる。 verilator では verilog で記述されたモジュールが C++ のクラスにコンパイルされるので、 そのクラスを生成して、インプットを設定し eval を読んでやることでモジュールの挙動をシミュレーションすることができる。 この段階になると単にソフトウェア的なテスト手法が適用できるので verilog でテストベンチを書くよりも良いかもしれない。

make showでは yosys を使ってモジュールをネットリストに変換し、grapviz によって表示する。 挙動確認のためにスクリプトで低レベルコマンドを使ってネットリストに変換している。 procコマンドは verilog の always などをフリップフロップに変換してくれる。 opt は基本的な最適化を行う。 techmapはハイレベルな回路をローレベルな素子に変換する。 abcは組み合わせ回路をターゲットに応じて最適化する。

make testbenchX.vvp は iverilog によってテストベンチをシミュレーション可能ファイルに変換する。 変換されたファイル実行可能で、内部的には vvp コマンドによって処理される。