組み込まれたエンジニア

我輩は石である。名前はまだ無い。

国がなすべきこと

2011-03-12 19:41:35 | Weblog
国民の生命・財産を守ることが最優先事項だ。

この目線で、しっかりと活動してほしいが、二次災害の恐れがある未曾有の状況に背筋が寒くなる。

知人と連絡が取れないままだけれど、個人に出来ることは祈ることだけ。

被災していなかったとしても、我々は偶然生きているにすぎない。
この世界の、どこで、どれだけの災害や事故・病気が発生するのか、自分では制御できないことには、ひたすら謙虚に、できるだけのことをするのみ。

幸運な人々は、それぞれの日々を精一杯生きていくことこそ、求められるのだろう。

無念にも亡くなられた方々のご冥福をお祈りします。

個人で出来ることということで、Googleがまとめた募金情報から自分がアクセスできるところを通して、義援金を送りました。

SystemCとNSL

2011-03-05 21:05:11 | Weblog
OSCIの標準コンパイラ(というよりクラスライブラリ)が無料で使えるので、ソフトウェアとの連携があるverificationでは、SystemCはよい選択肢の一つです。
ただ、残念な言語仕様のおかげで、これを0から書くのはハードウェア設計者にはとても大変です。
VerificationにおけるSystemCの便利さをハードウェア設計者に「簡単に」提供したいと思って、NSLは、SystemCへの合成をサポートしています。
今日は、しっかりと時間を取って、家に引きこもり、SystemCを意識させないで、SystemCを用いるVerficationのパッケージを作っていました。

このパッケージを含むLiveCygwinはIP ARCHからダウンロードできます。

実は、パッケージ作成しながら、いろいろと合成されるSystemCの記述も調整したので、この方法をサポートするNSL COREは、20110305版以降となります。(上記、LiveCygwinには導入済み)

たとえば、このパッケージの中の一つの例題ですが、下のようなNSLコードを tut2.nslという名前で用意します。

パッケージにはMakefileが入っているので、

make T=tut2 scsim

とすると、NSLをコンパイルし、SystemCに変換したものをコンパイルしてくれます。
これを、
./tut2_sim 10000
として、10μSまでシミュレーションすると、
Hello World: value = 100, count = 100
count = 101
count = 102
bye: count = 103
SystemC: simulation stopped by user.


となります。たったこれだけです。
同じようなことを行う合成可能なハードをSystemCで記述しようとすると、とっても大変で、お勧めしません。もちろん、_display なんてのは合成対象ではありませんが、NSLの記述はハードウェアの裏づけを持ったシーケンス回路を生成しているので、1クロックずつ仕事をするようなハードウェアを書くのは、この例題とほとんど同じ記述で可能です。

魔法はMakefileの中にあるというのもあんまりなんで、少し種明かし。

Makefileでは、nsl2scの呼び出しとg++の呼び出しを行っています。
nsl2scでNSLをSystemCに変換し、それをg++でコンパイルしているというわけです。
OSCIで要求されるsc_mainもnsl2scが自動生成していますので、凝ったことをしたければ、自動生成したSystemCのメインルーチンに手を入れることができます。
ここで示したような、テキストベースのシミュレーションでは、メインルーチンを見る必要もないはずです。

Makefileを使わずに、自助努力をしようとすると、長いおまじないが必要です。
今回は、次のようにコンパイルしています。

nsl2sc tut2.nsl -scsim2 -target tut2 -split
g++ -I/usr/local/systemc-2.2.0/include -L/usr/local/systemc-2.2.0/lib-cygwin tut2_sim.cpp -lsystemc -o tut2_sim.exe


今回の例題NSLは、次のコードです。



declare tut2 simulation { }

module tut2 {
reg count[8] = 0;
wire value[8];
func_self start(value);

count++;
if(count==100) start(count);

func start seq {
_display("Hello World: value = %d, count = %d", value, count);
_display("count = %d", count);
_display("count = %d", count);
_finish("bye: count = %d", count);
}
}