Chisel徒然メモ


Chiselは UCバークレー校で開発されたHDL(ハードウェア記述言語)です。ScalaベースのDSL(ドメイン固有言語)になります。
気がついたことやハマったことを徒然にメモるページです。もっと良い方法があれば教えてください。

Chisel早見表

https://chisel.eecs.berkeley.edu/2.2.0/chisel-cheatsheet.pdf
https://chisel.eecs.berkeley.edu/doc/chisel-testercheatsheet.pdf

Chiselでコードをを書く

var と val

基本的にはChiselでは val (=value) をつかう。 でも var (=variable) も使えたりする(エラーは出ない)。 Chiselのコードはその後同期回路になるので変数であるvarだと色々おかしなことになりやすい。Testのコードでは var を使うのでぼーっとしてると混じりやすい。

つながってない信号は消える

ModuleのIOポートで外部とつながってない入力があると、その入力は(おそらく)ゼロとして扱われる。またその入力に関する内部信号はFIRRTLからごっそり消される。モジュールも消える。TOPで繋がっている信号は消されないが、内部のモジュール間などで未配線の信号がある場合注意が必要。

Chiselでテストベンチを書く

PeekPokeTesterの使い方は、Chisel tutorial のサンプルコードがわかりやすい。TutorialRunnerが実行部分。それぞれのディレクトリにある Launcher で実行するテストを選択する。 Launcherへの入力は run-examples.sh の例のように SBT実行の際の ARGS で何を実行するか指定する。
このあたりはBashでもMakefileでやってもOK。

クロック信号

複数のクロックドメインを扱う場合に、信号をクロックに変換したり、その逆をしたくなる。

クロック信号の宣言

val my_clock   = Wire(Clock())

普通の信号をクロックに変換

val my_clock = hoge.asClock()

クロック信号を普通の信号に変換

val hoge = my_clock.asUInt

テストベンチで内部信号の波形を見たい

  • 実行にverilatorを使います
    • オプション --backend-name verilator をつければOK
  • VCDを吐くので、gtkwave なのを使って波形を表示します。
  • DUT部分はFIRからVerilogが生成される、Testerの方はC++のコード? 動作の詳細がちょっと良くわからないがとりあえず動く。
    • Chiselのprintfは$fwriteに変換される
    • verilatorが古いと$fwriteがエラーになる
    • Ubuntuのverilatorが少し古い
      • 最新版を使います。
      • SiFiveがDPKGを作ってくれているのでそれを使ってもOK
        • https://github.com/sifive/verilator/releases
        • ただし、Install先が /user/local になるので注意
        • Chiselのコードにprintfがあっても実行には問題ないが、実行してもコンソールには出ない。うーん?

テスベンチをVerilogバックエンドで実行した時と振る舞いが異なる(1)

val delay1   = Reg(init = UInt(0, 1))
delay1 := io.in_data 

だと、Verilogでの実行は問題ないが、Chisel(FIR)の実行ではdelay1がラッチにならない?

val delay1   = Reg(init = UInt(0, 1))
when (!reset) {
    delay1 := io.in_data 
}

こう書けば問題ない。

テスベンチをVerilogバックエンドで実行した時と振る舞いが異なる(2)

クロックゲートを入れでwithClock でクロックドメインを分離すると、Verilogバックエンドでは動くのに、Chisel/FIRRTLでは動かないことがある。Stackoverflowにも同じ事が報告されていたのでそういうものとして注意するのが良さそう。

追記:DUT側でSimulationのClockの2倍のClockをカンター等で生成して、その生成をEnable信号で制御する分には問題ない。Test側のPeek,Pokeも2倍Clockに合わせて動かせばOK.

非同期リセット

Chisel3でサポートの予定

EOF