Icarus Verilogはalways_ffとalways_combをサポートしていた
前回のブログエントリで「作ろう! CPU」本で紹介されているTD4 CPUの実装をオープンソースのHDL合成ツールであるYosysに移植しました。このエントリの中で以下のような指摘をしました。
Icarus VerilogがSystem Verilogの文法であるalways_ffとalways_combをサポートしていないので、シュミレーションが行なえない
ところがその後、調査をしてみたところ実はIcarus Verilogには上記サポートがあると判明したので、TD4 CPUのシミュレーションをオープンソースのツールで行なえるようになりました。このブログエントリはそのレポートです。
GTKWaveとIcarus Verilogのインストール
まずはシミュレーションに必要なツールをインストールします。ここではDebian GNU/Linuxを開発環境として想定します。
シミュレーション波形表示ソフトであるGTKWaveをインストールします。
$ sudo apt install gtkwave
次にIcarus Verilogの最新版であるバージョン11をインストールします。
$ git clone -b v11-branch https://github.com/steveicarus/iverilog.git
$ cd iverilog
$ sh autoconf.sh
$ ./configure
$ make -j4
$ sudo make install
4bit CPU TD4のシミューレション
シミュレーションに対応したTD4実装を取得します。
$ git clone -b feature/support-yosys-sim https://github.com/master-q/cpubook-code.git
上記リポジトリではIcarus Verilogに-g2012オプションを渡してalways_ffとalways_combをサポートさせています。
$ cd cpubook-code
$ git grep iverilog
chapter10/board/yosys-icestick/Makefile: iverilog -g2012 -o $@ $^
chapter12/board/yosys-icestick/Makefile: iverilog -g2012 -o $@ $^
では書籍の12章のシミュレーションを実行しましょう。
$ cd chapter12/board/yosys-icestick
$ make sim
GTKWaveのウィンドウが表示されます。test_topからツリーを辿ってcpuを選択しましょう。するとcpu.svで定義されているlogicがSignalsというリストに表示されるので、波形を観測したいSignalsをダブルクリックしましょう。すると以下のような波形が表示できます。
波形を見るに、以下のようにrom.svを正しく実行しているようです。
- スイッチは0x6に固定。これはテストベンチで指定されたもの
- LEDには最初0x6が出力される。これはBレジスタをすぐに出力しているため
- Aレジスタの0xDで初期化して、カウントアップし、キャリービットが立ったらBレジスタをインクリメント
現時点での制限
Icarus Verilogは現時点ではuniqueをサポートしておらず、単に無視します。
../../main//mother_board/cpu.sv:53: vvp.tgt sorry: Case unique/unique0 qualities are ignored.
この無視によって、もしcaseに重複があった場合にはwarningが検出されず、Verilogのコンパイルとシミューレションは意図しない結果になってしまいます。どうやらYosysも同様にuniqueを単に無視し、warningとして扱わないようです。
大規模なcaseを書く場合にはマッチに重複がないか検査したいので、uniqueのサポートを追加したいところです。
すいません、あんまり関係ないですが私のUbuntu 20.04環境だとsh autoconf.shでエラーが出てしまいます。そちらはどのディストリビューションを使ってますか?
Debian GNU/Linux sidを使っています。どのようなエラーが出るでしょうか?
Autoconf in root…
autoconf.sh: 10: autoconf: not found
Precompiling lexor_keyword.gperf
autoconf.sh: 13: gperf: not found
Precompiling vhdlpp/lexor_keyword.gperf
autoconf.sh: 16: gperf: not found
です。
apt-get install gperf autoconfで解決しないでしょうか
エラー分に従って足りないパッケージをインストールしたらinstallできました。ありがとうございました。