ブログのコメントで、CMakeを使ってVerilogのプロジェクトを扱うためにはどのようにすれば良いのか、という話を頂いた。
確かに、CMakeがサポートしているのはC++とか、ソフトウェアのプロジェクトばかりだ。 Verilogをプロジェクトをサポートするためにはどのようにすれば良いのだろうか。 まずは、単純にググってみるところから始めよう。
VerilogのデザインをCMakeで管理することによるメリット
Makefile作成の自動化
まずこれは当然だが、Makeによるビルドを自動化することができる。QuestaとかVivado Simulator,Vcsなどのコンパイル型のシミュレータは、ビルドのフローはソフトウェアのそれと大して変わらない。 従って、コマンドとオプションさえ適切に与えてやれば、CMakeでプロジェクト管理することによってMakefileの生成を自動化することができる。
CTestによるテスト結果の管理
これはCMakeというよるみツールセットと連携することによるメリットだが、CTestとうまく連携させることによりVerilogのシミュレーション結果を管理することができる。 さらに、これは最近知ったのだが、CDashというツールを利用すればリグレッション結果を綺麗な図として表示させることができるようだ。これも時間があれば挑戦してみたい。
Vivado SimulatorによるビルドとリグレッションをCMakeで自動化してみる
既存技術の調査
とりあえずググってみると、以下のようなプロジェクトを見つけた。
ああ、そうか。 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によるテストパタンを追加してみる。