SystemC+GoogleTestを試してみた
Twitter上でSystemCでテストフレームワークが使えるかの話をしている時に
以下ページを教えてもらったので試してみました。
Using existing unit test frameworks with SystemC - Stack Overflow
ソースコード
まずはページに載っているソースコードをファイルにします。
- exor2.hxx
- main.cxx
- main_1.cxx
- main_2.cxx
- stim.hxx
- mon.hxx
これだけでは足りないので以下サイトに載っているNANDのコードをファイルにする。
ファイル名は「nand2.hxx」
googletest
googletestは以下サイトにあるので最新の1.7をダウンロード
解凍後「./configure」「make」
googletest - Google C++ Testing Framework - Google Project Hosting
cmake
googletestはcmakeを使ってビルド環境を作るっぽいのでCMakeLists.txtを作成する。
cmakeを使った事がないので見よう見まねで作成したのが↓
cmake_minimum_required(VERSION 2.6) project(sc_unit_test) #SystemC Path include_directories(/home/ginnyu-tei/work/google_test/_lib/systemc-2.3.0/include) LINK_DIRECTORIES(/home/ginnyu-tei/work/google_test/_lib/systemc-2.3.0/lib-linux64) #googletest Path include_directories(/home/ginnyu-tei/work/google_test/_lib/gtest-1.7.0/include) LINK_DIRECTORIES(/home/ginnyu-tei/work/google_test/_lib/gtest-1.7.0/lib/.libs) #main build add_executable(main main_1.cxx main_2.cxx main.cxx) target_link_libraries(main pthread systemc gtest)
googletestのライブラリパスは「libgtest.a」があるディレクトリを指定すれば良いですが
ビルド環境によっては「gtest-1.7.0/build」に入っている時があります。
ビルド
ソースコードとCMakeLists.txtを同じフォルダに入れて以下実行
[ginnyu-tei@localhost google_test]$ mkdir build [ginnyu-tei@localhost google_test]$ cd build/ [ginnyu-tei@localhost build]$ cmake .. -- The C compiler identification is GNU 4.7.2 -- The CXX compiler identification is GNU 4.7.2 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Configuring done -- Generating done -- Build files have been written to: /home/ginnyu-tei/work/google_test/build [ginnyu-tei@localhost build]$ make Scanning dependencies of target main [ 33%] Building CXX object CMakeFiles/main.dir/main_1.cxx.o [ 66%] Building CXX object CMakeFiles/main.dir/main_2.cxx.o [100%] Building CXX object CMakeFiles/main.dir/main.cxx.o /home/ginnyu-tei/work/google_test/main.cxx: 関数 ‘int sc_main(int, char**)’ 内: /home/ginnyu-tei/work/google_test/main.cxx:25:18: 警告: warn_unused_result 属性付きで宣言されている ‘int RUN_ALL_TESTS()’ の戻り値を無視しています [-Wunused-result] Linking CXX executable main [100%] Built target main
Warningが出ているがビルドはできた。
実行ログ
[ginnyu-tei@localhost build]$ ./main SystemC 2.3.0-ASI --- Jan 9 2014 22:05:39 Copyright (c) 1996-2012 by all Contributors, ALL RIGHTS RESERVED Running main() from gtest_main.cc [==========] Running 2 tests from 1 test case. [----------] Global test environment set-up. [----------] 2 tests from systemc_test [ RUN ] systemc_test.test1 Time A B F 0 s 0 0 0 0 s 0 0 1 10 ns 0 1 1 20 ns 1 0 1 30 ns 1 1 0 Info: /OSCI/SystemC: Simulation stopped by user. [ OK ] systemc_test.test1 (1 ms) [ RUN ] systemc_test.test2 unknown file: Failure C++ exception with description "Error: (E113) insert primitive channel failed: elaboration done In file: sc_prim_channel.cpp:216" thrown in the test body. [ FAILED ] systemc_test.test2 (1 ms) [----------] 2 tests from systemc_test (2 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (2 ms total) [ PASSED ] 1 test. [ FAILED ] 1 test, listed below: [ FAILED ] systemc_test.test2 1 FAILED TEST [ OK ] systemc_test.test2 (2 ms) [----------] 2 tests from systemc_test (3 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (3 ms total) [ PASSED ] 2 tests. [ OK ] systemc_test.test1 (4 ms) [ RUN ] systemc_test.test2 Time A B F 0 s 0 0 0 0 s 0 0 1 10 ns 0 1 1 20 ns 1 0 1 30 ns 1 1 0 Info: /OSCI/SystemC: Simulation stopped by user. [ OK ] systemc_test.test2 (1 ms) [----------] 2 tests from systemc_test (5 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (5 ms total) [ PASSED ] 2 tests. [ OK ] systemc_test.test2 (2 ms) [----------] 2 tests from systemc_test (6 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (6 ms total) [ PASSED ] 2 tests. [ginnyu-tei@localhost build]$
なんかfailしてる・・・
SystemC2.2に変えてみた。
SystemC2.2で実行する際はmain_1.cxxとmain_2.cxxに以下の
includeを追加しないとエラーになった。
(別の環境では追加しなくてもビルドできたので環境依存かも)
#include <unistd.h>
SC2.3と同じ様にビルドして実行
[ginnyu-tei@localhost build]$ ./main SystemC 2.2.0 --- Jan 9 2014 23:02:22 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED Running main() from gtest_main.cc [==========] Running 2 tests from 1 test case. [----------] Global test environment set-up. [----------] 2 tests from systemc_test [ RUN ] systemc_test.test1 Time A B F 0 s 0 0 0 0 s 0 0 1 10 ns 0 1 1 20 ns 1 0 1 30 ns 1 1 0 SystemC: simulation stopped by user. [ OK ] systemc_test.test1 (1 ms) [ RUN ] systemc_test.test2 unknown file: Failure C++ exception with description "Error: (E546) sc_start called after sc_stop has been called In file: sc_simcontext.cpp:1315" thrown in the test body. [ FAILED ] systemc_test.test2 (1 ms) [----------] 2 tests from systemc_test (2 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (2 ms total) [ PASSED ] 1 test. [ FAILED ] 1 test, listed below: [ FAILED ] systemc_test.test2 1 FAILED TEST [ OK ] systemc_test.test2 (2 ms) [----------] 2 tests from systemc_test (3 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (3 ms total) [ PASSED ] 2 tests. [ OK ] systemc_test.test1 (3 ms) [ RUN ] systemc_test.test2 Time A B F 0 s 0 0 0 0 s 0 0 1 10 ns 0 1 1 20 ns 1 0 1 30 ns 1 1 0 SystemC: simulation stopped by user. [ OK ] systemc_test.test2 (1 ms) [----------] 2 tests from systemc_test (4 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (4 ms total) [ PASSED ] 2 tests. [ OK ] systemc_test.test2 (1 ms) [----------] 2 tests from systemc_test (5 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (5 ms total) [ PASSED ] 2 tests.
うーん・・・分からん・・・