チラシの裏は意外と白くない

最近忘れっぽくなったので調べたことをチラシの裏に書きます

SystemCの環境構築

SystemC。名前と何となくは知っていたけど、日本語の文献があまりにも少ないor高いことから躊躇していたけど、どうもある程度理解しないといけない雰囲気になってきている。今更感がすごいけど。 今回は環境の勉強も兼ねてWSLにSystemCをいれて、Hello Wolrdを表示させるところまで。

ダウンロード

Accelleraのサイトから最新の2.3.3をダウンロードしてきた。

accellera.org

インストール

まずはC++

SystemC以前にg++すら入っていないので、まずはこれから。

# g++のインストール
$ sudo yum -y install gcc-c++
# バージョン確認
$ g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)

余談だが、markdownソースコードの埋め込みをはじめてやってみた。Syntaxハイライトがいい感じ。行ごとに色を変えるとか行番号をつけるとかもできるらしい。 ただ、今後勉強したいSystemVerilogは非対応っぽい。やはりHDL全体的に下火なのか。。

SystemC

先ほどダウンロードしたsystemc-2.3.3.tar.gzを適当なディレクトリに持ってきて、

# 解凍
$ tar zxvf systemc-2.3.3.tar.gz
$ cd systemc-2.3.3
# 適当に作業用のディレクトリを作成
$ mkdir obj
$ cd obj
# インストール先は/usr/local/systemcでバージョンを切っておく
$ ../configure --prefix=/usr/local/systemc/2.3.3 'CXXFLAGS=-std=c++11'
$ export CXX=g++
$ make
$ sudo make install
$ make check

SystemCのインストール先を環境変数に設定しておく。慣習的に$SYSTEMC_HOMEなのか?

export SYSTEMC_HOME=/usr/local/systemc/2.3.3

Hello Worldするまで

make checkも通ったし、これでSystemCの準備ができたはず。まずは定番のHello World

#include <systemc.h>

int sc_main(int argc, char *argv[]){
    printf("Hello world\n");
    return 0;
}

で、$SYSTEMC_HOME/includeをインクルードディレクトリに入れてコンパイル

$ g++ -I. -I$SYSTEMC_HOME/include -c hello.cpp -std=c++11
$ g++ -I$SYSTEMC_HOME/include -L. -L$SYSTEMC_HOME/lib-linux64 hello.o -lsystemc -lm
$ ./a.out 
./a.out: error while loading shared libraries: libsystemc-2.3.3.so: cannot open shared object file: No such file or directory

コンパイルはできたけど、systemc-2.3.3.soが見つからないらしい。

$ ldd a.out 
        linux-vdso.so.1 =>  (0x00007fffd9cba000)
        libsystemc-2.3.3.so => not found
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f17ccf00000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f17ccbf0000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f17cc9d0000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f17cc5f0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f17cd400000)

$LD_LIBRARY_PATHの設定を見てみると、環境変数自体が宣言されていなかった。

$ echo $LD_LIBRARY_PATH
    

これも.bashrcに書いてやって、

export LD_LIBRARY_PATH
# for systemc
export SYSTEMC_HOME=/usr/local/systemc/2.3.3
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SYSTEMC_HOME/lib-linux64

再度実行

$ ./a.out 

        SystemC 2.3.3-Accellera --- Mar  6 2020 21:56:17
        Copyright (c) 1996-2018 by all Contributors,
        ALL RIGHTS RESERVED
Hello world

最後にコンパイルコマンドをスクリプトとしてまとめておいた。実行ファイル名はrun.xにするのが慣習のようなので?そのようにしておいた。

#!/bin/sh
g++ -I. -I$SYSTEMC_HOME/include -c hello.cpp -std=c++11
g++ -I$SYSTEMC_HOME/include -L. -L$SYSTEMC_HOME/lib-linux64 -o run.x hello.o -lsystemc -lm

とりあえずここまで。