新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

PCIe と SystemC

PCIe なんかうまくいかないと思っていたら、、、リセット信号の極性を間違えていた。つねにリセットしっぱなし。そりゃうまく動かない。いま合成中。あと 30 分はかかる。

systemC を FreeBSD で動かした。以前、インストールしたままだった。まぁ、ハーフアダーは簡単にシミュレートできる。RGB の変換も作ってみた。まぁうまくできる。シミュレート実行時に printf を入れられるので結果が比較的わかりやすい。

文法として、というより関数の wait() はどうかな、、、状態遷移は一本道なことが多いからいいのか。

構文は C++ なので私にとっては書きやすい。ただ、頭の中は C++ ではだめだ。当然、時間の概念も入れていかないといけない(時間の概念のないモデルもあるみたいだけど)。代入なんてのは C++ での考えでやっていてはだめなのだ。

verilog でいうところの assign がない、、、SC_METHOD で代用するようだ。基本的にそろっている道具はそう複雑ではない。しかし、C++ の上にのっているから、やろうと思えば複雑なテンプレートも書けそう。ただし、それは意味がない。合成できなくなる。

合成できないといえば、複数のCTHREADの中で一つの変数に代入をするとどうなるかやってみた。当然、VHDL などではコンパイル時にエラーが出る類のものだ。C++ だからエラーにはならない。実行時に core をはく。

 signal `signal_4' (sc_signal)
 first driver `rgb0.transform' (sc_cthread_process)
 second driver `rgb0.bug_bug' (sc_cthread_process)

ついでにいうと合成は出来ない。どうも今の状況だと systemC でシミュレーションして VHDL や verilog で書き直すというのがよいらしい。今後に期待だ。

C++ をふんだんに使わず、言語仕様をきっちり決めると合成できる気がする(VHDL の書き方にほぼ対応しているので)。