SystemVerilog を対象に Concolic Testing を行うプロトタイプです。 シミュレータによる実行と、シンボリック実行を交互に繰り返すことで SystemVerilog で記述された回路に対するラインカバレッジ100%のテストケースを生成します(DART[1]やHYBRO[2]などと同様)。
現状では、サポートしている SystemVerilog の機能と性能に制限があります。
Disclaimer: PFN provides no warranty or support for this software. Use it at your own risk.
このソフトウェアはPFN2018 夏季インターンの一環として、主に押川広樹さんによって開発されました。
- OCaml (>= 4.05.0)
- dune (>= 1.0.1)
- z3 (>= 4.7.1)
- ocamlgraph (>= 1.8.8)
- ppx_deriving (>= 4.2.1)
- Z3 (>= 4.7.1)
- menhir (>= 20180703)
- SystemVerilog Simulator
OCamlの ライブラリと menhir は opam からインストール出来ます。
make
_build/default/src/main.exe -i file.sv -f file.bin -v log.vcd -s script.sh
現状では、パーサの warning が大量に出ます。
file.sv
: 対象の SystemVerilog プログラムfile.bin
: 実行中に回路の入力ベクトルを読み書きするためのファイルlog.vcd
: シミュレーション結果が出力される VCD ファイルscript.sh
: シミュレーションを実行するシェルスクリプト。file.sv
の回路をfile.bin
の入力に対して実行し、結果をlog.vcd
として出力することが必要。
-c dump coverage information
-dparse dump parsed tree
-dir dump IR
-dcfg generate dot files from CFG
-dtrace dump trace
-dz3 dump z3 log
-dinputs file dump all input vectors to [file]
-test run without concrete execution
- ソースコードを解析して Control Flow Graph(CFG) を生成
- シミュレーションのためにランダムな入力ベクトルを生成
- シミュレーションを実行
- VCD を元に CFG のどのパスが実行されたかを計算
- 実行されていない部分を実行するのに必要な制約をシンボリックに求める
- SMT ソルバーを用いて制約を解く
- 得られた解から入力に関わる部分を取り出して、次の入力とする
- 全ての部分が実行されるまで 3-7 を繰り返す
上の過程で得られた入力ベクトルがテストケースとなる。
- lexer.mll: レキサー
- parser.mly: パーサー
- parsetree.ml: パース後の抽象構文木
- ir.ml: 簡潔な内部表現と抽象構文木からの変換
- cfg.ml: CFG と 内部表現からの変換
- vis.ml: CFG の可視化のための関数
- ce.ml: VCD と CFG から実行されたパスを計算
- constraint.ml: まだカバーされていない CFG のパスをたどるために必要な制約を計算
- solve.ml: Z3 を用いて制約を解消
- main.ml: 全体をくっつける
MITライセンス(詳細は LICENSE ファイルを参照)。
- [1] P. Godefroid, N. Klarlund, and K. Sen, DART: Directed Automated Random Testing. In Proceedings of the 2005 ACM SIGPLAN conference on Programming language design and implementation (PLDI'05), 2005.
- [2] L. Liu and S. Vasudevan, Efficient validation input generation in RTL by hybridized source code analysis, In Proceedings of the 2011 Design, Automation & Test in Europe, Grenoble, 2011.