chiselで内部信号のモニタ。VCDダンプしGTKWAVEで確認

最近、少しずつchiselを使うようにしているのですが、 chisel/iotesters.PeekPokeTesterで内部信号のモニタのをしようとpeek関数で内部レジスタを選択してみました。(peek(dut.r_quotient )みたいな感じで)

すると、「value r_remainder is not a member of simple.Divider」というエラーが出て、ビルドに失敗してしまいましした。 不思議に思い、調べてみると、びっくりしました。 今は「chiselでは内部信号がモニタできない」ようでした

Chisel test - internal signals - Stack Overflow

↑によると、モニタするにはVCD取得してgtkwave等で波形観測するしかできないようでした。 そのうちさすがにモニタできるようになると信じていますが、わざわざ波形取得しなくても、 値ダンプさえできればデバッグできる場面はそれなりにあるため、結構面倒な気がしました。

また、VCD取得しないで内部信号を確認するワークアラウンドとして、以下は使える気がしました。 適宜取り入れていく感じですね。

  1. モニタ用の出力ピンを用意すること
  2. モジュールを可能な限り小さい単位(FFすらモジュール)で分ける
  3. 諦めてverilogを使う

chiselでVCDダンプして、GTKWAVEで波形確認

chiselでVCDダンプする方法を示します。

参考: Frequently Asked Questions · freechipsproject/chisel-testers Wiki · GitHub

  1. chiselのiotestersに「("--generate-vcd-output", "on")」オプションを追加
  2. Veriatorを使用する(「--backend-name verilator」オブション)(こちらは不要かもしれません)
  iotesters.Driver.execute(Array[String]("--generate-vcd-output", "on"), () => new Divider()) {
    c => new DividerTester(c)
$(SBT) "test:runMain simple.DividerTester --backend-name verilator"

GTKWAVEインストール方法

gtkwaveのインストール方法は以下を参考にしました。 特に何かエラー出る問題はエイリアスを貼ることで回避できました。

https://ughe.github.io/2018/11/06/gtkwave-osx

alias gktwave="/Applications/gtkwave.app/Contents/Resources/bin/gtkwave"

GTKWAVEで波形確認

gtkwaveで波形確認すると、pokeで入力した信号がnegedgeのタイミングで入力されていて、わかりやすかったです。ただ、一瞬どういうこと?とは思いましたが。 negedge論理を組んだときに問題にならないのかとも思いました。多分回避策あるでしょうが。

# VCD波形確認
$(GTKWAVE) ./test_run_dir/simple.DividerTester2058623782/Driver.vcd

# スクリプトSave後(Write Safe file)
$(GTKWAVE) ./test_run_dir/simple.DividerTester2058623782/Driver.gtkw