NetBSD/amd64でChisel HDLからVerilogを生成してシミュレーションしてみる

この記事は、 NetBSD Advent Calendar 2018の20日目の記事です。

はじめに

MIPSの 命令セットアーキテクチャーと実装が オープンソースになるような時代が来るとは思っていませんでした。 これもRISC-Vへの期待に影響があるのかもしれません。

Chiselと言うハードウェア記述言語は、そのRISC-Vの代表的な実装である Rocket chip の多くの部分を書くのに使われているものです。

今回は、Rocket chipは大規模過ぎるので、Chiselのチュートリアルである Chisel TutorialsのChiselコードをVerilogに変換して、 verilatorでのシミュレーション実行もしてみたいと思います。

私はこれからChiselで書いてみたい回路があるのですが、 NetBSDで生活して良くあるのは、そもそも環境が整わない、整ったと思ったら誤作動している と行ったことなので、既存の正しく動くことの分かっているものが、同じように動くことを 確認するのは大切です。

Chiselの環境の準備

Chiselは、ScalaというJava Virtual Machine (JVM)で動く処理系で書かれています。 Chisel自体が、Scala言語のドメイン固有言語(DSL)になっています。

Chiselの処理系は、sbt (pkgsrc/lang/scala-sbt)を使って各環境ごとに それぞれ用意します。 ですので、/usr/local以下にインストールしておくといったことは 一般的ではないようです。

まずは、pkgsrc.lang/scala-sbtのインストールですが、 NetBSD/amd64のネイティブなOpenJDK 8ではうまく動きません。 Java Native Access (JNA)がサポートされていないのが いけませんし、他にも理由はありそうです。 pkgsrc/lang/openjdk8をちゃんと直さないといけません…。 ですが、ここでは先を急いでpkgsrc/lang/oracle-jdk8を 使うことにしてしまいます。 java.sun.com からLinux/x86_64用のJREとJDKの配布物をダウンロードして$DISTDIR に配置した上で、以下のように実行すれば良いでしょう。

# cd /usr/pkgsrc/lang/scala-sbt
# make ACCEPTABLE_LICENSES=oracle-binary-code-license install
これで、Oracle JDKを追加でインストールしてsbtはそれを使うようにできます。 pkgsrc/lang/openjdk8と共存できるので、 アンインストールは不要です。

Chisel Tutorialsから試してみます。chisel-tutorialの Gitリポジトリーをクローンし、まずはFIRRTLでシミュレーションをしてみます。 Chisel Tutorialsの課題の加算器の解答例をシミュレーションしてみます。 初回は、Chisel自体のインストールも実行されます。

$ git clone git@github.com:ucb-bar/chisel-tutorial.git
$ cd  chisel-tutorial
$ sbt -v "test:runMain solutions.Launcher Adder"
(snip)
[info] Loading settings from build.sbt ...
[info] Set current project to chisel-tutorial (in build file:/home/ryoon/chisel/chisel-tutorial/)
[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list
[info] Running solutions.Launcher Adder
Starting tutorial Adder
[info] [0.002] Elaborating design...
[info] [1.010] Done elaborating.
Total FIRRTL Compile Time: 508.3 ms
Total FIRRTL Compile Time: 82.5 ms
file loaded in 0.149673865 seconds, 6 symbols, 2 statements
[info] [0.001] SEED 1545137294717
test Adder Success: 10 tests passed in 15 cycles in 0.020284 seconds 739.49 Hz
[info] [0.007] RAN 10 CYCLES PASSED
Tutorials passing: 1
[success] Total time: 4 s, completed 2018/12/18 21:48:16
どうやら、テストまで成功したようです。

次には、Verilogのコードを生成し、Verilatorによるシミュレーションも実施してみます。 ですが、そうやらChiselは、GNU makeがmakeと言う名前でPATH にあることを前提にしているようです。 Chiselをbuildし直したら良いのでしょうが、ここでは簡便に/usr/pkg/bin/gmakemakeとしてシンボリックリンクを作成してしまいます。

# cd /usr/pkgsrc/cad/verilator
# make install
$ ln -s /usr/pkg/bin/gmake make
$ PATH=./:$PATH sbt -v "test:runMain solutions.Launcher Adder --backend-name verilator
      Archiving VAdder__ALL.a ...
ar r VAdder__ALL.a VAdder__ALLcls.o VAdder__ALLsup.o
ranlib VAdder__ALL.a
c++    Adder-harness.o verilated.o verilated_vcd_c.o VAdder__ALL.a    -o VAdder -lm -lstdc++
make: Leaving directory '/home/ryoon/chisel/chisel-tutorial/test_run_dir/solutions/Adder'
sim start on brownie at Tue Dec 18 21:56:19 2018
inChannelName: 00029411.in
outChannelName: 00029411.out
cmdChannelName: 00029411.cmd
STARTING test_run_dir/solutions/Adder/VAdder
[info] [0.001] SEED 1545137775286
Enabling waves..
Exit Code: 0
[info] [0.022] RAN 10 CYCLES PASSED
Tutorials passing: 1
[success] Total time: 6 s, completed 2018/12/18 21:56:19
テストまで完了し成功したようです。 ここで、Verilogのソースコードはtest_run_dir/solutions/Adder/Adder.vに 生成されます。 これをVerilatorでシミュレーションした際の波形ファイルは、test_run_dir/solutions/Adder/Adder.vcdに 生成されます。 pkgsrc/cad/gtkwaveで波形を見ることができます。
# cd /usr/pkgsrc/cad/gtkwave
# make install
$ gtkwave test_run_dir/solutions/Adder/Adder.vcd
ですが、今の私には波形が正しいかを判断することはできません…。

Chiselでの回路の記述と確認は、どうにかNetBSD/amd64上でも実施できそうです。

Comments

Popular posts from this blog

NetBSD/amd64-currentをAmazon Web Service EC2 c5インスタンスで動かしてみる

PostgreSQLのOracle Foreign Data WrapperをWindowsで使う

Oracle OLEDB Provider Version 12.2.0.1.0 for Windows x86をインストールする際のエラー