はじめに
筆者のおべんきょーを兼ねてますので間違いなどがありましたら教えてくださいまし
そもそもChiselとは
Chiselとは、Scalaで書かれたプログラムをHDLに変換してくれるツール
HDLでは記述が大変な処理を完結に書けることから最近多くの企業が利用を始めつつある??
Edge TPUもこのChiselで書かれているのだとか?(真相は知らない)
環境構築(Ubuntu18.04では確認済み)
まず、sbtと呼ばれるScalaのコンパイラが必要で、以下のコマンドを実行するとインストール可能
$ echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
$ sudo apt-get update
$ sudo apt-get install sbt
以上を実行するとScalaのコンパイラをインストールできる
他のOSでインストールをしたい場合は以下の資料を確認するとよい(動作確認はしていないけど多分動く)
MacOS
$ brew install sbt
Windows
ごめんなさい、以下を見てください
https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Windows.html
サンプルプログラムの実行
ScalaでのHelloWorldは以下のように実行するとよい(以下はScalaのサンプルプログラムであって、Chiselを実際に利用しているわけではない)
object HelloScala extends App{
println("Hello Chisel World!")
}
実行と結果
$ sbt "runMain HelloScala"
[info] running HelloScala
Hello Chisel World.
以上の様にでてきたら成功
最初のsbtの実行の際は、Scalaのライブラリのインストールで結構時間がかかったので気長に待ちましょう
2回めの実行からは大体5秒くらいで実行できるかと
次は実際にChiselを利用してみましょう
Chiselを利用するには、makeやビルドファイルを記述する必要があり非常にめんどくさいが、以下のものを利用すると楽に環境構築が可能である
$ git clone https://github.com/schoeberl/chisel-examples.git
$ cd chisel-examples/hello-world/
Scalaのバージョンによっては以下のような記述に変える必要がある
scalaVersion := "x.x.x" #自分の使用しているScalaのバージョンを指定
# 以下はScalaのバージョンが2.12以上の人は記述する必要がある
# どうやらScalaの記述方法がバージョンアップすると記述方法が変わってしまうらしく、それを調節している
# Pythonで例えると、print文が何故かかわってしまったあんな感じ
scalacOptions ++= Seq(
"-Xsource:2.11"
)
// libraryDependencies += "edu.berkeley.cs" %% "chisel" % "latest.release"
// libraryDependencies += "edu.berkeley.cs" %% "chisel" % "2.2.38"
resolvers ++= Seq(
Resolver.sonatypeRepo("snapshots"),
Resolver.sonatypeRepo("releases")
)
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.1.3"
// libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "latest.release"
$ sbt about
hello-worldでコンパイルするプログラムが以下のような構成になっている
LEDが0.5秒毎にチカチカしてくれるやつ
import chisel3._
import chisel3.Driver
class Hello extends Module {
val io = IO(new Bundle {
val led = Output(UInt(1.W))
})
val CNT_MAX = (50000000 / 2 - 1).U;
val cntReg = RegInit(0.U(32.W))
val blkReg = RegInit(0.U(1.W))
cntReg := cntReg + 1.U
when(cntReg === CNT_MAX) {
cntReg := 0.U
blkReg := ~blkReg
}
io.led := blkReg
}
object Hello extends App {
chisel3.Driver.execute(Array[String](), () => new Hello())
}
コンパイルすると、ビルドしているディレクトリにこんな感じのファイルが出力されるはず
module Hello( // @[:@3.2]
input clock, // @[:@4.4]
input reset, // @[:@5.4]
output io_led // @[:@6.4]
);
reg [31:0] cntReg; // @[Hello.scala 20:23:@8.4]
reg [31:0] _RAND_0;
...
endmodule
あとはトップモジュールを作成すれば動くはず!!!
(実行確認済み、PinPlannerとかはテキトーにググってなんとかしてちょ)
以下トップモジュール
module hello_top(input clk, output led);
wire h_io_led;
wire res;
assign led = h_io_led;
assign res = 0;
Hello h(.clock(clk), .reset(res), .io_led( h_io_led ));
endmodule
参考文献