11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Chiselメモ

Last updated at Posted at 2015-06-19

#概要
FPGAで何かしようと思ったらHDLを触ることに大抵なるのだが、
主流のひとつ、VHDLはひたすら冗長で、もうひとつのVerilogは機能が貧弱である。
SystemVerilogはなかなか素晴らしいが、あまり論理合成ツールが対応していない。
というわけで選択肢はVHDL/Verilogの二択である。

こんな状況に我慢できるような人がエンジニアにいるわけもなく、
「論理合成ツールがVHDL/Verilogにしか対応していないなら、
何か素晴らしい言語で一旦書いて、それをVerilog/VHDLにコンバートすればいいじゃない」
と考えた人が何人もいて、思い思いに「素晴らしい言語」を作った。
そんな言語のうちのひとつ、ScalaのDSLであるChiselをちょっと触ってみた。そのメモ。

HDLはざっくり言えば回路図の代わりで、回路図は宣言的である。
となれば比較的宣言的に書ける言語のほうが書きやすいだろう。
ということでScalaベースのChiselをチョイスした。
ちなみに偉そうに色々書いているがScalaは触ったことがない。
HDL歴もかなり浅い。

#導入
必要な物は

  • sbt
  • Scala
  • JDK

肝心のChiselはsbtが良きに計らってくれる。

#ハロワ
とりあえずチュートリアルを参考にこんな感じの品々を作る

Project/
  Build.sbt
  chisel-dependent.sbt
  src/
    main/
      Scala/
        Hello.scala

設定用ファイル2つ

Build.sbt
organization := "edu.berkeley.cs"
version := "MyVersion-1.0"
name := "MyChiselTemplate"
scalaVersion := "2.11.6"
scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-language:reflectiveCalls")
chisel-dependent.sbt
val chiselVersion_h = System.getProperty("chiselVersion", "latest.release")
libraryDependencies ++= ( if (chiselVersion_h != "None" ) ("edu.berkeley.cs" %% "chisel" % chiselVersion_h) :: Nil; else Nil)

モジュール記述部分

Hello.scala
package Hello

import Chisel._

class Hello extends Module {
  val io = new Bundle {
    val out = UInt(OUTPUT, 8)
  }
  io.out := UInt(42)
}

class HelloTests(c: Hello) extends Tester(c) {
  step(1)
  expect(c.io.out, 42)
}

object Hello {
  def main(args: Array[String]): Unit = {
    val tutArgs = args.slice(1, args.length)
    chiselMainTest(tutArgs, () => Module(new Hello())) {
      c => new HelloTests(c)
    }
  }
}

用意できたらProjectに移動して
> sbt
とコマンドを打ってsbtを起動。

> compile
でコンパイルして

> run Hello.Hello --backend v --targetDir ./verilog
でProject\verilog\にverilogファイルが生成される。

生成されたものがこちら

Hello.v
module Hello(
    output[7:0] io_out
);



  assign io_out = 8'h2a;
endmodule

なんか妙な改行ができたが、
変換しても変数名とかが結構そのままなのが地味に嬉しい。

ちなみに
> run --backend --targetDir ./cpp
とすればcpp以下にシミュレーション用のcppファイルが出力される。
まだよく見ていない。

#終わり
レジスタに明示的にクロックを設定したり
ともかく色々出来るようなので、
何か書いてみて合成可能なVerilogコードを吐かせるための加減を見たい。

11
11
1

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
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?