Chiselとは何者か、なぜRISC-Vで使われているのか

# Chisel
表題の通り、RISC-Vで使われているHDL（？）のChiselに興味が湧いたので調べていたのですが、このChisel、さっぱり正体がつかめません。
日本語、英語問わず解説記事が少なすぎです。

そもそも、どのレベルのハードウェア記述を対象としているのか、言語の狙いはなにか、から分かりません。
RISC-Vという「普及させたい」CPUの記述言語に選んだわけですから、きっと何かすごい理由があるはずなのです。

せっかく調べたので、まとめます。


## Chisel の特徴
ここは[公式の箇条書き](https://chisel.eecs.berkeley.edu/)や、[DAC2012の論文](https://chisel.eecs.berkeley.edu/chisel-dac2012.pdf)を読み込んでいくのが近道のようです。

- ハードウェア構築（construction）言語（高位合成言語ではない）
- Scalaの処理系をベースに拡張された言語
- 代数的（algebraic）構築と配線
 - Scalaにはalgebraicという概念のデータタイプ（sum type）があり、それが使えるという意味かと思われる
- バルク接続
 - SystemVerilogのinterfaceのようなものだが、よりスマート（かつ安全）
- 階層的＋オブジェクト指向的＋機能的構築
- メタプログラミングを利用して高度にパラメタ化可能
- 特定分野向け言語のレイヤー化をサポート
- 浮動小数点を含む大量のライブラリ
 - ここで言うライブラリは、Scalaのものであって、HWの合成用ライブラリではないと思われる
- 複数のクロックドメイン
- EDAツール向きのVerilog生成可能

また、論文の方では

- サイクル精度C++シミュレーターを出力可能

ともあります。

いくつか耳慣れない言葉がありました。代数的構築（Algebraic construction）、ハードウェア構築言語（Hardware Construction Language）と、特定分野向け言語のレイヤー化（layering of domain specific languages）という言葉です。

このあたり、調べないといけません。


### 代数的構築
[代数的データ型](https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B)、という概念があるようです。
[直和の記事](https://ja.wikipedia.org/wiki/%E7%9B%B4%E5%92%8C#%E9%9B%86%E5%90%88%E3%81%AE%E7%9B%B4%E5%92%8C)も参考にすると、直感的には

> 既知の数学的対象を「貼り合わせ」て同じ種類の対象を新たに作り出す操作の一種

がわかりやすいです。Scalaでは Sum type（直和）という名前になっていますし。
また、

> https://medium.com/@shannonbarnes_85491/algebraic-data-types-in-scala-701f3227fe91
> Having an algebraic data type in Scala simply means two things are involved:
> 
> - A sum type consisting of various subtypes of other sum and product types.
> - The ability to analyze the values of the algebraic data with pattern matching.

ということでした。

つまり、SystemCであればC++の機能であっさりできることですが、既存のデータ型から新たなデータ型を作り出せ、かつそれを用いて回路構造を記述できる。ということでしょう。

論文に掲載されていた複素数の例を引用します。

```scala
class Complex(val real: Fix, val imag: Fix) extends Bundle {
  def +(b: Complex): Complex =
    new Complex(real + b.real, imag + b.imag)
  ...
}

class Example extends Component {
  val io = new Bundle {
    val a = new Complex(Fix(2, INPUT), Fix(2, INPUT))
    val b = new Complex(Fix(2, INPUT), Fix(2, INPUT))
    val out = new Complex(Fix(2, OUTPUT), Fix(2, OUTPUT))
  }
  val c = io.a + io.b
  io.out.r := c.r
}
```

このような使い方を代数的構築と呼んでいるようです。
オブジェクト指向として、普通なのですが、VHDL/SystemVerilogでは難しいことではあります。

SystemCと比べてどうかというと、明らかにChiselのほうがスマートだと、個人的には思います。


### ハードウェア構築言語
ハードウェアを作る言語はハードウェア記述言語（Hardware Description Language）とするのが一般的かと思いますが、Chiselはハードウェア構築言語（Hardware Construction Language）を銘打っています。なにか違うのでしょうか。
というか、よくよく見ると、Chisel（Constructing Hardware in a Scala Embedded Language）らしいです。じょうずー:clap:。全部大文字じゃないから気づきませんでした。

少なくとも、高位合成を狙っている言語ではない、とのことなので、ビヘイビアレベルの記述をする言語ではなさそうです。

いろいろ調べてみましたが、なぜ construction なのかをはっきり明記している箇所はありませんでした。
論文にかかれていた動機だと、

- VHDL/Verilog などは、もともとは仕様記述、シミュレーションのための言語
- ハードウェアを「作る」という観点では無理くりしている部分が大きい（推論に頼っており、無駄な記述も多い）
- 昨今の複雑かつ大規模なハードウェアを記述するには言語として貧弱
- ハードウェアを「作る」ことに主眼をおいたモダンな言語として設計されたのがChisel

という流れで、Hardware Construction Language なのかな、と。


### 特定分野向け言語のレイヤー化
特定分野向け言語のレイヤー化（layering of domain specific languages）という言葉の意味は分かりません。このキーワードはDAC2012の論文でも大々的に使われています。

特定分野向け言語とは、ある特定のアプリケーション用HWを設計するための言語を指しています。
論文で挙げられているのは、DILがストリーミングプロセッシング向け、Bluespecが並行処理向け、などです。

こういった、特定のアプリケーション（ドメイン）向け仕様記述言語は、私も他に覚えがあります。

この手の言語の問題点として、当然、その特定分野向け言語がモデル化したアプリケーションに ”はまらなければ”、全く使えないわけです。
ほんのちょっとでも、例外的な仕様が含まれていると使えません。

また、そういった超マイナー言語の学習コスト、ツールチェインへの慣れや、そのプレイヤーの少なさが故のサポートの貧弱さ、なども無視できません。
そういった背景から、Chiselは特定分野向け言語を、Chisel上に実装できるように設計されているそうです。

とはいえ、具体的にはなんなのか。

論文には例として switch 構文が示されています。
どうも、Scalaにはswitch構文は存在しないようですが、Chiselがそういった制御構文を拡張したようです。
同じように、新しい特定分野向け言語を設計する際に、Chiselの上に制御構文などを新規に追加できるそうです。調べてみると、構文の拡張はScala自身の特徴です。
Chisel の意図しているところは、Chiselが他のHW設計言語の礎になるように設計されている。ということではないかと思われます。

なお、

> We are exploring embedding new domain-specic languages in Chisel to provide high-level behavioral synthesis.

とのことです。
大変期待しております。


## Chisel の抽象レベル
特徴を調べたり、サンプルなどを見る限り、RTL (Register Transfer Level) から下の抽象度だと思われます。
特に、ネットリストの接続がスマートになりそうです。RTLにしても、Verilogなどに比べて記述量を大きく削減できそうなので期待できます。

RTL以下が扱えれば、SystemVerilogの先の設計言語としてはありではないでしょうか。

また、将来的にChiselの拡張としてより高いレベルの抽象度に持っていける（混在も容易だと思われる）のは面白いと感じます。


## Chisel のメリットとデメリット
ざっと調べてみた限り、つまるところChiselは「高度にパラメタ化されたRTLをスマートに作りたい」という欲求に答えるための言語のようでした。
私にとってのメリット・デメリットをまとめると、

- メリット
 - シンプルに、かつ柔軟に回路構造を記述できる
 - ライブラリが充実していることは検証作業時に有効
 - Scala用のIDEが使える
 - フリーである
 - 非同期設計がサポートされている
- デメリット
 - サポートがない（問題があっても自己責任）

このデメリットが・・・仕事で使うのを躊躇させますね。
ソフトウェアと違い、LSIは1ミスで億単位の損失がでるのでサポートなしは恐怖です。
きっちり検証しなさいということでしょうか。

全体的にあまり余計なことはせず、記述量削減のためのトランスパイラに徹している姿勢に好感が持てます。


# RISC-VのとChisel
RISC-Vはかなり柔軟なアーキテクチャパラメータをもっていて、ワード幅、アドレッシングモード、命令セット群、さらにはユーザー拡張命令セットまで。これはVerilogでは設計したくありません。

当然、ジェネレータを作ることになるわけですが、Chiselの特徴を調べてみればなるほど、使いたくなるわけです。1からジェネレータを作るよりかは、遥かに。

RISC-VのみならずIP設計者的には垂涎の言語であろうChiselでした。
とはいえ、RTL以下の抽象度なので高度なIP（動画デコーダーIP）などは結局苦労しそうです。
使ってみようかな。