LoginSignup
3
3

More than 5 years have passed since last update.

EclipseでChisel

Posted at

Chiselはなかなか素敵なんだけど、
チュートリアルが当然のごとくコンソール使ってて 怖い 面倒だからイマイチ手が出せない。
じゃあIDEで使えば私のようなITゆとりも安心してかけますね。

なおEclipse初めて触るレベルの人が書いてます。

Chisel

ScalaでHDLが書ける素晴らしいライブラリ。
ScalaをHDLに変換(高位合成)するのではない
あくまで内部DSL、ScalaでVerilogを書くためのライブラリ。

RISC-Vという命令セットのCPUがChiselで設計されて公開されている。

必要なもの

Scala IDE for Eclipse

Chisel + αが既に導入されているちょうどいいEclipseプロジェクト

自分で作るより
Eclipseで書いている人のリポジトリ探して引っ張ってくるのが手っ取り早い
ということでこれを使わせてもらう。
https://github.com/althebaker43/simple_chisel_counter

Mavenプラグイン

上記プロジェクトがMaven使っているようなので。

とりあえず動かしてみる

Nビットカウンターとそのテスト(Scala JUnit)が入っていて
テストを走らせるとちゃんとパスする。

Verilog出力してみる

object example {
  def main(args: Array[String]): Unit = {
    val mainArgs = Array("--backend","v","--targetDir","./verilog")
    chiselMain(mainArgs, () => Module(new Counter()))
  }
}

こんなコードを追加して実行すればverilog下に.vファイルが生成される

Counter.v
module Counter(input clk, input reset,
    output[3:0] io_out,
    input  io_reset
);

  reg [3:0] countReg;
  wire[3:0] T4;
  wire[3:0] T0;
  wire[3:0] T1;
  wire[3:0] T2;
  wire T3;

`ifndef SYNTHESIS
// synthesis translate_off
  integer initvar;
  initial begin
    #0.002;
    countReg = {1{$random}};
  end
// synthesis translate_on
`endif

  assign io_out = countReg;
  assign T4 = reset ? 4'h0 : T0;
  assign T0 = T3 ? T2 : T1;
  assign T1 = io_reset ? 4'h0 : countReg;
  assign T2 = countReg + 4'h1;
  assign T3 = io_reset ^ 1'h1;

  always @(posedge clk) begin
    if(reset) begin
      countReg <= 4'h0;
    end else if(T3) begin
      countReg <= T2;
    end else if(io_reset) begin
      countReg <= 4'h0;
    end
  end
endmodule

生成されるコードは可読性皆無なので、ブラックボックスとして割りきりましょう。

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