#概要
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つ
organization := "edu.berkeley.cs"
version := "MyVersion-1.0"
name := "MyChiselTemplate"
scalaVersion := "2.11.6"
scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-language:reflectiveCalls")
val chiselVersion_h = System.getProperty("chiselVersion", "latest.release")
libraryDependencies ++= ( if (chiselVersion_h != "None" ) ("edu.berkeley.cs" %% "chisel" % chiselVersion_h) :: Nil; else Nil)
モジュール記述部分
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ファイルが生成される。
生成されたものがこちら
module Hello(
output[7:0] io_out
);
assign io_out = 8'h2a;
endmodule
なんか妙な改行ができたが、
変換しても変数名とかが結構そのままなのが地味に嬉しい。
ちなみに
> run --backend --targetDir ./cpp
とすればcpp以下にシミュレーション用のcppファイルが出力される。
まだよく見ていない。
#終わり
レジスタに明示的にクロックを設定したり
ともかく色々出来るようなので、
何か書いてみて合成可能なVerilogコードを吐かせるための加減を見たい。