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