去年辺りから日本でもよく聞くようになったRISC-Vを触ってみたくなったので、Chiselを勉強してみようと思いたった。
RISC-Vもだし、Chiselについてもあんまり日本語の記事見当たらなかったので備忘の意味も兼ねてブログに書いて公開してみる。
Chiselは、デジタル回路設計用の、オープンソースのハードウェア記述言語(HDL: Hardware Description Language)の一種である。カリフォルニア大学バークレー校で開発が行われている。Chiselは、Scalaの内部DSLとして実装されている。
Chisel - Wikipediahttps://ja.wikipedia.org/wiki/Chiselja.wikipedia.org
いや、RISC-Vはむちゃくちゃ詳しく書いてくださってる方が何人かいらっしゃるんですがね、、msyksphinzさんとか↓
まずは各種Chiselの環境を入れる前にいくつかやっておきたいがある(下記参照)のでまずはそこから。
やっておきたいこと
- scalaの勉強
- シミュレータの準備
1. は上記Wikiの引用にもあるとおり、ChiselはScalaの内部DSLだから。Scala、、書けないですし。。。
2.はやっぱりシミュレーションで動かしたいよね!!という単純な理由。
環境の準備
最終的には、Chisel→RTL→FPGA実装で何か動かしたい!!なのでVivado入れて合成環境&シミュレーション環境を構築する。
これをやるにあたって、Vivadoシミュレータって制限あったりしないかしら、と思ったのだけど特に制限もない模様。
まあ、そんな大規模デザインをシミュレーションすることもないだろうから、なんか起きた時に考えよう。
Vivado® シミュレータは、豊富な機能を備えた Verilog、SystemVerilog および VHDL 言語に対応する混合言語シミュレータです。すべての Vivado HLx Edition に含まれ、追加料金は不要です。デザイン サイズ、インスタンス、または行数の制限がないため、1 つの Vivado ライセンスで無制限のインスタンスの混合言語シミュレーションを実行できます。
Vivado シミュレータ
Vivadoのインストール
先に、これ以降の自分の作業環境を記載
CPU | AMD Ryzen 7 1700 |
Memory | 16GB |
OS | Ubuntu 16.04 |
Kernel Version | 4.13.0-45 |
Vivadoは以下のページからLinux版のウェブインストーラーをダウンロード
インストールについては、特に変更もせずにインストール。
途中で聞かれるどのバージョンを使うかの選択肢は、"Web" Pack"を選択。
Webインストールでそこそこのデータをダウンロードするのでしばし待機。。。
Vivadoの起動
インストール終わるとデフォルト設定なら/optの下にVivadoがインストールされる。
その中に以下の設定があるので、こいつをsourceすると各種設定やってくれるので楽。。
- /opt/Xilinx/Vivado/2017.4/settings64.sh
source /opt/Xilinx/Vivado/2017.4/settings64.sh
設定ファイル読みこみの後、Vivadoを起動
以下の手順で適当にテストプロジェクトを作成する
- [FIle] -> [New Proect]を選択でプロジェクト作成画面が立ち上がる
- [Next]押して、"Project Name"画面で適当にプロジェクト名と場所を指定
- 次の画面で"RTL Project"のボタンにチェック
- "Add Sources"は何もないのでそのまま[Next]を選択
- "Add Constraints"も同様[Next]を選択
- "Default Parts"は適当にSpartan-7のデバイスから選択
- 次の画面で[Finish]押して作成完了
テスト用RTLの作成
めちゃ適当に32bitのFFを作成する。
1. 画面左の"PROJECT MANAGER"から[Add Sources]を選択
2. 開いた画面で"Add or create degisn sources"を選択して[Next]
3.[Create File]を選択して、開いた画面でFile Nameを適当に埋めてファイル作成
4. 作成したファイルにFFを実装。
module test_ff( input wire clk ,input wire rst_n ,input wire [31:0] i_data ,input wire wren ,output reg [31:0] o_data ); always @(posedge clk or negedge rst_n) begin if (!rst_n) begin o_data <= #1 {32{1'b0}}; end else if (wren) begin o_data <= #1 i_data; end end endmodule // test_ff
5. シミュレーション用のテストベンチファイルの作成
1-4と同じ手順で作るが、2.の時に"Add or create simulation sources"を選択。これを選択することで"PROJECT MANAGER"上の"Sources"の"Simulation Sources"の下にベンチファイルが生成される。
6. 適当にベンチ記述を実装。今回はリセット解除後にFFにライトして値チェックしておしまいな感じ。
module topsim(); // clock reg clk; initial begin clk = 1'b0; forever begin clk = #50 !clk; end end // reset reg rst_n; initial begin rst_n = 1'b1; #100; rst_n = 1'b0; #100; rst_n = 1'b1; end // initial begin // ff access reg r_wren; reg [31:0] r_wdata; wire [31:0] w_o_data; task idle(); #1 r_wren = 1'b0; @(posedge clk); endtask // idle task wr(input [31:0] wdata); #1 r_wren = 1'b1; r_wdata = wdata; @(posedge clk); endtask // wr // write ff initial begin idle(); @(posedge rst_n); idle(); wr(32'hdead_beaf); idle(); if (w_o_data == 32'hdead_beaf) begin $display("OK"); end else begin $display("NG"); end $finish(1); end // initial begin test_ff DUT ( .clk (clk ) ,.rst_n (rst_n ) ,.i_data (r_wdata ) ,.wren (r_wren ) ,.o_data (w_o_data ) ); endmodule
7. シミュレーションの実行
"Run Simulation"をクリック!!
8. 文法エラーがなければシミュレーションが実行される
と、これでとりあえず動作確認はできた。