bonotakeの日記

ソフトウェア工学系研究者 → AIエンジニア → スクラムマスター・アジャイルコーチ

ハードウェア構築言語 Chisel がアツい(かもしれない)

いきなりタイトルと関係なさそうな話題からスタートしますが、今週1番のトピックは、なんと言ってもEdge TPUがオフィシャルに発売されたことでしょう。
しかもUSB接続のアクセラレータがたった80ドル弱ですよ。日本だとMouserで8800円ほど。

こいつをいち早く入手できたIdein社内でのお試し結果がこちら。

10msってことはあと6ms程度別の処理に充てても高精度カメラのフレームレート60fpsに間に合っちゃうってことで、これはくそっ速い。
僕は去年夏にEdge TPUがアナウンスされたときから、これが世に出回った時点でAIチップ戦争は終結するかなって思ってたんですが、本当にそうなりそう。変な欠陥でも見つからない限り。ヤバイ。

で、昨日あたり更にびっくりしたのは、このEdge TPUがChiselという言語で設計された、というのを知ってからでした。
以下がその話をしている動画(英語)。

www.youtube.com

Chiselについては今まで

  • RISC-V界隈で流行っているらしい
  • ディープラーニングコンパイラTVM専用のISAであるVTAã‚’Chiselで実装するプロジェクトが始まったらしい

くらいを聞きかじった程度で、言語の中身もよく知らず興味もそんなに湧いてこなかったんです。
が、実製品に適用されてしかも出来がよさそうだ、となると、やはり俄然興味が湧いてきます。

ということで、調べてみました。
……と言っても一晩でそんなに沢山調べられるはずもなく、ひとまず

あたりをざっくり読みました。以下自分なりのChiselの特徴まとめ。

ハードウェア構築言語である

Chisel は自身をハードウェア構築言語(Hardware Construction Language)と名乗っています。そもそもこれが聞き慣れない用語。
よく知られているのはVHDLやVerilog HDLなどのハードウェア記述言語(Hardware Description Language, HDL)で、ちょっと詳しい人ならSystemC(や既に消え去ったSpecC)なんかの俗に言う高位設計言語くらいかなと思うわけですが、これらと何が違うのか。

自分のもやっとした理解を誤解を恐れず端的に言うと、RTLそのものの抽象度を上げた言語なのかな、という感じです。
RTL(Register-Transfer Level)とは、つまりレジスタや演算器モジュールとその間の接続のデータフローを記述するレベルです。これまでのHDLはこの抽象度で書かれる想定をしていました。
で、これでは抽象度が低く生産性が低いため、SystemCなどはビヘイビアレベル、つまり回路の振る舞いをソフトウェアライクな抽象度で書けるようになっています。

ただ、HDLにしろSystemCにしろ、RTLがあって、その上にビヘイビアレベルがある、という観念に則っていました。これは長らくハードウェア業界の常識だったわけです。

しかし、Chiselはその常識に則っておらず、RTLを書くけどRTLそのものの抽象度が上がっているというノリに見えます。

Scalaの組込みDSLである

で、その抽象度を上げる要因となっているのが、このChiselがScalaの組込みDSLとして実現されている点。

Scalaとは2000年代に登場した言語で、ものすっごくざっくりした説明をするならJavaを関数型言語のフレーバーで書けるようにしたプログラミング言語、というノリのものです。
で、Chiselはこいつの組込みDSL、つまりScala内に埋め込まれたハードウェア設計特化言語なわけです。
言語を組込みDSLとして設計する意図は言語によって様々ですが、Chiselの場合はScalaというモダンなプログラミング言語の機能をフル活用してハードウェアが書けるというのが狙いであるように見えます。

考えてみるに、VHDLはAdaという古いプログラミング言語が元になっており、VerilogはそこにCやPascalのフレーバーをかぶせたもの。要するにベースとなっている言語が古いわけです。
で、ハードウェアがこういうベースの古い言語でずっとやってきた傍らで、ソフトウェアの言語は抽象度が上がり、型システムなんかもかなり整備されて、少ない記述量で高度な記述ができるようになっていました。
なので、ベースの言語をモダンなものに置き換えればそれだけで生産性は随分上がる、ということは確かに言えるかも。もちろん口でいうほど簡単なことではないんですが。

Chiselの機能

上でも述べたように、Chiselで記述するものの大枠はデジタル回路のRTLです。 しかし、中に記述されるモジュールが (オブジェクト指向的な)オブジェクトであり、関数でもあります。なのでソフトウェア的に高い抽象度でモジュールを書き下せるっぽい。
オブジェクト指向的なオブジェクトなので継承も使えるし、さらにジェネリクスも使えます。一部にはトレイトも使われています。こういう最近の言語に備わっている多相性がハードウェアの記述に使えます。
あと随所に型推論を使えるので煩雑な記述をかなりの部分省略できます。
今時のプログラミング言語を知ってる人には随分書きやすい言語だろうなと思います。基本ソフトウェアエンジニアの会社であるGoogleで採用されたのもむべなるかな、という気がします。

Chiselの短所

なるほど良さそうだな、というChiselの個人的印象なんですが、一方で上で紹介した動画ではChiselの短所も述べられていました。
いくつかあったけど個人的に印象に残ったのは以下の2つ。

学習コストが高い

動画では、Chiselの学習は

  1. ChiselでのRTLの書き方を覚えるフェーズ
  2. Scalaに習熟するフェーズ
  3. Chiselをツールとして使いこなすフェーズ

の3段階ある、と言っていて、しかもほとんどのハードウェアエンジニアは1の段階を超えられないという話。確かにそうかもしれない。

検証がクソムズい

らしい。 Googleの検証エンジニアがだいぶ死んでたようです。
これはまだChiselが未成熟なせいなのかな、という気もするんですけど、Chiselが吐き出すSystemVerilog記述がChiselのソースとうまく対応付けられず、低レベルのRTL記述が検証と非常に相性が悪い、など。チップ設計の検証をするにはまだまだ物足りないところが多いようです。

[追記] この記事読んで「検証できないんじゃ使い物にならん」みたいな反応をしている人がちょいちょいいるので補足しておきますと、Edge TPUチームの動画ではChiselの長所として「ソフトウェア的な単体テストが非常に有効だった」という話を述べています。独立した検証エンジニアの手によるチップ全体への検証が難しい代わりにこうしたソフトウェア的なテスト手法で検証を補っていた(補えた)ということなのかもしれません。[追記終わり]

結論

まぁそういう短所はありつつも、少数精鋭のチームが生産性を上げたいならChiselはいい言語だろうなという印象。きちんと使いこなせる人が使えばVerilogなんかで書くよりも全然楽チンかもしれないですね。

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。