ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Vivadoシミュレータの動作確認

スポンサーリンク

去年辺りから日本でもよく聞くようになった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さんとか↓

msyksphinz.hatenablog.com

まずは各種Chiselの環境を入れる前にいくつかやっておきたいがある(下記参照)のでまずはそこから。

やっておきたいこと
  1. scalaの勉強
  2. シミュレータの準備

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版のウェブインストーラーをダウンロード

japan.xilinx.com

インストールについては、特に変更もせずにインストール。
途中で聞かれるどのバージョンを使うかの選択肢は、"Web" Pack"を選択。
Webインストールでそこそこのデータをダウンロードするのでしばし待機。。。

Vivadoの起動

インストール終わるとデフォルト設定なら/optの下にVivadoがインストールされる。
その中に以下の設定があるので、こいつをsourceすると各種設定やってくれるので楽。。

- /opt/Xilinx/Vivado/2017.4/settings64.sh

source /opt/Xilinx/Vivado/2017.4/settings64.sh 

設定ファイル読みこみの後、Vivadoを起動
以下の手順で適当にテストプロジェクトを作成する

  1. [FIle] -> [New Proect]を選択でプロジェクト作成画面が立ち上がる
  2. [Next]押して、"Project Name"画面で適当にプロジェクト名と場所を指定
  3. 次の画面で"RTL Project"のボタンにチェック
  4. "Add Sources"は何もないのでそのまま[Next]を選択
  5. "Add Constraints"も同様[Next]を選択
  6. "Default Parts"は適当にSpartan-7のデバイスから選択
  7. 次の画面で[Finish]押して作成完了

テスト用RTLの作成

めちゃ適当に32bitのFFを作成する。

1. 画面左の"PROJECT MANAGER"から[Add Sources]を選択

f:id:diningyo-kpuku-jougeki:20180811183547p:plain

2. 開いた画面で"Add or create degisn sources"を選択して[Next]

f:id:diningyo-kpuku-jougeki:20180811183717p:plain

3.[Create File]を選択して、開いた画面でFile Nameを適当に埋めてファイル作成

f:id:diningyo-kpuku-jougeki:20180811183853p:plain

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"の下にベンチファイルが生成される。

f:id:diningyo-kpuku-jougeki:20180811184209p:plain

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"をクリック!!

f:id:diningyo-kpuku-jougeki:20180811184721p:plain

8. 文法エラーがなければシミュレーションが実行される

f:id:diningyo-kpuku-jougeki:20180811184956p:plain

と、これでとりあえず動作確認はできた。