LoginSignup
5
1

More than 3 years have passed since last update.

Chiselの環境構築(Chisel勉強会1)

Last updated at Posted at 2019-12-02

はじめに

筆者のおべんきょーを兼ねてますので間違いなどがありましたら教えてくださいまし

そもそも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を実際に利用しているわけではない)

HelloScala.scala
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秒毎にチカチカしてくれるやつ

Hello.scala
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())
}

コンパイルすると、ビルドしているディレクトリにこんな感じのファイルが出力されるはず

Hello.v
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

参考文献

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1