FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

CMakeによりVerilogのビルドを管理するための調査(1. CMakeによるビルド環境の構築)

ブログのコメントで、CMakeを使ってVerilogのプロジェクトを扱うためにはどのようにすれば良いのか、という話を頂いた。

確かに、CMakeがサポートしているのはC++とか、ソフトウェアのプロジェクトばかりだ。 Verilogをプロジェクトをサポートするためにはどのようにすれば良いのだろうか。 まずは、単純にググってみるところから始めよう。

VerilogのデザインをCMakeで管理することによるメリット

Makefile作成の自動化

まずこれは当然だが、Makeによるビルドを自動化することができる。QuestaとかVivado Simulator,Vcsなどのコンパイル型のシミュレータは、ビルドのフローはソフトウェアのそれと大して変わらない。 従って、コマンドとオプションさえ適切に与えてやれば、CMakeでプロジェクト管理することによってMakefileの生成を自動化することができる。

CTestによるテスト結果の管理

これはCMakeというよるみツールセットと連携することによるメリットだが、CTestとうまく連携させることによりVerilogのシミュレーション結果を管理することができる。 さらに、これは最近知ったのだが、CDashというツールを利用すればリグレッション結果を綺麗な図として表示させることができるようだ。これも時間があれば挑戦してみたい。

CDash

www.kitware.com

Vivado SimulatorによるビルドとリグレッションをCMakeで自動化してみる

既存技術の調査

とりあえずググってみると、以下のようなプロジェクトを見つけた。

github.com

ああ、そうか。 add_custom_commandがあるんだった!CMakeのサポートしていない言語でも、add_custom_commandがあるからそれで自由に依存関係を作れば良い!

Vivado Simulatorの環境をCMakeで作成

とりあえず、フリーのシミュレータとしてVivado Simulatorを選択した。Verilogの場合生成する物が明確なオブジェクトファイルではなくデータベースなどになり、C++と比べて依存関係の記述がちょっと難しくなる。 またツール毎に生成物が異なるので注意が必要だ。

ここでは、単純な4ビット加算器とそれをテストするためのテストベンチを用意してみた。

  • adder.v
`timescale 100ps/100ps

module adder
  (
   input wire [ 3: 0] in_A,
   input wire [ 3: 0] in_B,
   output wire [ 4: 0] out_C
   );

  assign out_C = in_A + in_B;

endmodule // adder
  • test_adder.v
`timescale 1ps/1ps

module test_adder;
  reg [ 3: 0] in_A;
  reg [ 3: 0] in_B;
  wire [ 4: 0] out_C;

  adder
    adder_0
      (/*AUTOINST*/
       // Outputs
       .out_C                           (out_C[4:0]),
       // Inputs
       .in_A                            (in_A[3:0]),
       .in_B                            (in_B[3:0]));


  initial begin
    for (in_A = 0; in_A < 10; in_A=in_A+1) begin
      for (in_B = 0; in_B < 10; in_B=in_B+1) begin
        #100;
        $display ("in_A=%01x, in_B=%01x, out_C=%02x", in_A, in_B, out_C);
      end
    end
    $finish;
  end

endmodule // test_adder

依存関係を記述する

add_custom_commandにより記述していくのだが、僕がCMakeにあまり詳しくないことまり、あまりうまく記述できていない。 本来ならばファイルリストを用意して、単純に生成コマンドを入れていくだけなのだが、、、

下記のような依存関係にしてみた。

adder_test.v → xsim.dir/work/test_adder.sdb  (xvlog.batで生成)
adder.v → xsim.dir/work/adder.sdb (xvlog.batで生成)
xsim.dir/work/test_adder.sdb, xsim.dir/work/adder.sdb → test_adder (xelab.batで生成)

これをCMakeで記述するのだが、正直これはあまり綺麗ではない。Verilogファイルが増えたらその分add_custom_commandも増やさいないといけない! 上記の先駆者のプロジェクトでは、for文を使ってうまく書いているが、これを見習うべきだな。。。

っていうか、Verilog用のサポートを自分で記述してCMakeにpull requestしてみればいいんじゃないか? なんちて。

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project (test_adder)

add_custom_command (OUTPUT xsim.dir/work/test_adder.sdb
  COMMAND /cygdrive/c/Xilinx/Vivado/2015.4/bin/xvlog.bat test_adder.v
  DEPENDS test_adder.v
)

add_custom_command (OUTPUT xsim.dir/work/adder.sdb
  COMMAND /cygdrive/c/Xilinx/Vivado/2015.4/bin/xvlog.bat adder.v
  DEPENDS adder.v
)

add_custom_target (test_adder
  COMMAND /cygdrive/c/Xilinx/Vivado/2015.4/bin/xelab.bat -debug typical test_adder -s top_sim
  DEPENDS xsim.dir/work/adder.sdb xsim.dir/work/test_adder.sdb
)

Makefileの作成

cmakeを叩くと、ちゃんとMakefileが生成された。

$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/masayuki/work/xvlog_test

ただし、custom_targetを使っているのでmakeにオプションを付ける必要がある。

$ make help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... test
... edit_cache
... rebuild_cache
... test_adder

$ make test_adder
[ 50%] Generating xsim.dir/work/test_adder.sdb
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/usr/work/xvlog_test/test_adder.v" into library work
INFO: [VRFC 10-311] analyzing module test_adder
[100%] Generating xsim.dir/work/adder.sdb
INFO: [VRFC 10-2263] Analyzing Verilog file "C:/usr/work/xvlog_test/adder.v" into library work
INFO: [VRFC 10-311] analyzing module adder
Vivado Simulator 2015.4
Copyright 1986-1999, 2001-2015 Xilinx, Inc. All Rights Reserved.
Running: C:/Xilinx/Vivado/2015.4/bin/unwrapped/win64.o/xelab.exe -debug typical test_adder -s top_sim
Multi-threading is on. Using 6 slave threads.
Starting static elaboration
Completed static elaboration
Starting simulation data flow analysis
Completed simulation data flow analysis
Time Resolution for simulation is 1ps
Compiling module work.adder
Compiling module work.test_adder
Built simulation snapshot top_sim
[100%] Built target test_adder

ビルドは完了した!今度は、CTestによるテストパタンを追加してみる。