ハードウェア開発につかうツールチェインはベンダー製ソフトウェアが多いが、 利用する FPGA によっては FOSS ツールチェインでも可能なようだ。
Fomu に載っている iCE40 はビットストリームの解析が完了しているため、 すべての工程を FOSS ツールで完結できる。
HDL の合成は yosys を使うことで行える。
yosys のマニュアルは長いのでちゃんと読んでいないが、
コマンドを入力していくことで様々な工程を実施できる。
この工程は TCL でスクリプト化することもできる。
また自分でスクリプトを組まなくても、ビルトインで良い感じの合成を行ってくれる synth_ice40
のような便利コマンドも用意されている。
yosys にもシミュレーションを行う sim
コマンドが用意されているが、
対応している機能が少ないようなのでテストベンチを書くには iverilog や verilator を使うのが良さそうだ。
iverilog は verilog シミュレータで verilog でテストベンチを記述するのに使える。 ただし即時 assert が master ブランチでしか使えないので注意が必要。 ハードウェア開発に詳しくないのだが、assert を使わずに波形を確認するほうが一般的なのかもしれない。 波形は gtkwave を使えば見ることができる。
verilator は合成可能な verilog を C++ にコンパイルしてくれるシミュレータだ。 高速なのが売りらしく、公式サイトでは 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 コマンドによって処理される。