Icarus Verilogは既にalways_ffとalways_combをサポートしていた話

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のサポートを追加したいところです。

Icarus Verilogは既にalways_ffとalways_combをサポートしていた話」への5件のフィードバック

  1. すいません、あんまり関係ないですが私のUbuntu 20.04環境だとsh autoconf.shでエラーが出てしまいます。そちらはどのディストリビューションを使ってますか?

      • 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
        です。

  2. エラー分に従って足りないパッケージをインストールしたらinstallできました。ありがとうございました。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください